本教學將引導你構建一個基於 PHP 後端與 AJAX 前端的 RSS 聚合器。核心挑戰在於瀏覽器同源策略禁止跨域請求 XML,解決方案是建立一個 PHP 代理類別,將遠端 RSS 下載至本地暫存,再由前端 AJAX 讀取本地副本,實現跨域聚合。
在 HTML <head> 引入樣式與腳本:
<link href="css/layout.css" rel="stylesheet" type="text/css" /> <script src="js/request.js"></script>
表單僅包含一個輸入框與提交按鈕,頁面載入時自動發送一次請求:
<body onload="makeRequest('request.php?request=' + document.feedForm.feed.value + '&password=mypassword')">
<form name="feedForm" method="post" action="javascript:makeRequest('request.php?request=' + document.feedForm.feed.value + '&password=mypassword')">
Enter a feed: <input type="text" name="feed" id="feed" size="20">
<input type="submit" name="submit" value="Add Feed">
</form>
<div id="logo"></div><hr/>
<div id="copy"></div>
<div id="details"></div>
</body>
三個 <div> 分別用於顯示 Logo、版權資訊與條目明細,樣式定義於 layout.css。
classes/RSS.class.php 核心邏輯:
<?php
class RSS {
function get($rss_url) {
if ($rss_url != "") {
// 1. 確保快取目錄存在
$dir = "rss";
if (!is_dir($dir)) { mkdir($dir, 0666); } // Windows 下模式參數會被忽略,保留以利移植
// 2. 以 URL 的 MD5 為檔名,保證唯一
$file = md5($rss_url);
$path = "$dir/$file.xml";
// 3. 複製遠端 RSS 至本地
copy($rss_url, $path);
return $path; // 回傳本地路徑供前端讀取
}
}
}
?>
驗證密碼後實例化 RSS 類別並輸出本地路徑:
<?php
if ($password == "mypassword") {
require_once('classes/RSS.class.php');
$rss = new RSS();
echo $rss->get($request);
} else {
echo "You are an unauthorized user";
}
?>
makeRequest(url) 建立 XMLHttpRequest 物件,支援 IE6 ActiveX 回退。request.php,攜帶 request(RSS URL)與 password 參數。DOMParser 或 responseXML 解析 RSS,提取 <title>、<link>、<description> 等節點,動態填入 logo、copy、details 三個容器。瀏覽器阻擋 XMLHttpRequest 直接存取不同網域資源。本方案讓 PHP 在同網域下充當「中繼站」:
0666 權限,並定期清理過期檔案(如 cron 每日刪除 24 小時前的 .xml)。$rss_url 嚴格驗證協議(僅允許 http/https)與域名白名單,防止 SSRF 攻擊。