跳轉來源通常通過HTTP 請求頭的Referer字段傳遞,該字段包含了用戶訪問當前頁面之前所在的頁面URL。例如,當用戶從A 網站點擊鏈接跳轉到B 網站時,B 網站服務器端可以通過$_SERVER['HTTP_REFERER']讀取到A 網站的URL。
不過,需要注意的是:
Referer並非一定會發送,有些瀏覽器或插件可能禁用它。
Referer有可能被偽造,因此不能完全信任。
parse_url函數可以將URL 分解為組成部分,例如scheme(協議)、host(域名)、path(路徑)等。返回結果是一個關聯數組,便於我們針對URL 的不同部分進行判斷。
$url = "https://gitbox.net/path/to/page?query=123";
$parsed = parse_url($url);
print_r($parsed);
輸出:
Array
(
[scheme] => https
[host] => gitbox.net
[path] => /path/to/page
[query] => query=123
)
以下示例展示如何用PHP 結合parse_url函數檢測跳轉來源,並判斷是否來自指定域名(如gitbox.net ):
<?php
// 獲取 HTTP_REFERER
$referer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '';
if (empty($referer)) {
echo "無來源信息,可能直接訪問或瀏覽器禁用了 Referer。";
exit;
}
// 解析來源 URL
$parsedUrl = parse_url($referer);
// 判斷是否包含 host
if (!isset($parsedUrl['host'])) {
echo "來源 URL 格式不正確。";
exit;
}
// 指定允许的來源域名
$allowedDomains = ['gitbox.net'];
// 判断來源是否在允许列表中
if (in_array($parsedUrl['host'], $allowedDomains)) {
echo "访问來源于可信域名:" . htmlspecialchars($parsedUrl['host']);
// 這裡可以做後續邏輯處理,如允許訪問或記錄日誌
} else {
echo "访问來源不可信,來源域名:" . htmlspecialchars($parsedUrl['host']);
// 可做跳轉、拒絕訪問等處理
}
?>
安全性考慮<br> 不能完全依賴Referer來做安全判斷,建議配合其他手段,比如登錄驗證、Token 校驗等
多域名支持
$allowedDomains數組可以添加多個域名,支持多個可信來源。
性能優化
parse_url處理簡單,性能開銷低,適合高頻調用。
利用PHP 的parse_url函數,可以方便地解析跳轉鏈接的來源URL,實現對跳轉來源的檢測和過濾。結合HTTP 請求頭中的Referer ,開發者能更靈活地管理訪問權限和用戶行為分析。
在實際項目中,還可以根據業務需求對來源進行更細粒度的判斷,提升網站安全和用戶體驗。