場景:URL 參數值包含 #、&、= 等保留字符時,直接傳遞會導致參數截斷。例如 c.php?key=9#888,PHP 僅能獲取到 9。
# 在 URL 中標識錨點(Fragment),瀏覽器**不會**將其及後內容發送給服務器。同理,& 分隔參數,= 分隔鍵值,若參數值含這些字符,必須編碼。
<input id="searchs" placeholder="輸入SN碼" />
<a class="btn" onclick="searchSN()">查詢</a>
<script>
function searchSN() {
const keys = $('#searchs').val().trim();
if (!keys) return alert('請填寫SN碼');
// 編碼:保留字符全部轉義,空格變 %20
const encoded = encodeURIComponent(keys);
window.location.href = 'c.php?key=' + encoded;
}
</script>
keys = escape(keys); // 已棄用,不編碼 @ * _ + - . /
差異: encodeURIComponent 編碼範圍更全(含 # & = + 等),符合 RFC 3986;escape 保留字符較多,且對 Unicode 處理不一致,MDN 已標記棄用。
<?php // $_GET 自動完成 URL 解碼 $key = $_GET['key'] ?? ''; echo $key; // 直接獲得原始值 "9#888"
$referer = $_SERVER['HTTP_REFERER'] ?? ''; // 注意:用戶可偽造/禁用,不可作為安全依據
$url = 'https://zhidao.baidu.com/question/123456789.html'; $content = @file_get_contents($url); // 生產環境建議用 cURL,支援超時、重定向、Header 自定義
| 字符 | URL 編碼 | 場景 |
|---|---|---|
| # | %23 | 錨點/參數值 |
| & | %26 | 參數分隔/參數值 |
| = | %3D | 鍵值分隔/參數值 |
| 空格 | %20 | 參數值 |
| % | %25 | 編碼標識/參數值 |
| + | %2B | 表單空格/參數值 |
核心原則:前端負責編碼,傳輸層透明傳遞,後端自動解碼。切勿嘗試在 PHP 中通過 $_SERVER['REQUEST_URI'] 手動解析,極易出錯且不可維護。