首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP $_SERVER 變量差異詳解:PHP_SELF vs SCRIPT_NAME vs REQUEST_URI

     編輯:PHP 相關知識

PHP $_SERVER 變量差異詳解:PHP_SELF、SCRIPT_NAME、REQUEST_URI

$_SERVER['PHP_SELF']、$_SERVER['SCRIPT_NAME']、$_SERVER['REQUEST_URI'] 都返回當前腳本路徑相關信息,但行為差異巨大,錯誤使用易導致安全漏洞(如 XSS)或路由錯誤。本文通過具體 URL 示例對比三者差異。

對比表(假設部署在 https://www.example.com/example/)

訪問 URLPHP_SELFSCRIPT_NAMEREQUEST_URI
https://www.example.com/example//example/index.php/example/index.php/
https://www.example.com/example/index.php/example/index.php/example/index.php/example/index.php
https://www.example.com/example/index.php?a=test/example/index.php/example/index.php/example/index.php?a=test
https://www.example.com/example/index.php/dir/test/dir/test/example/index.php/example/index.php/dir/test

核心差異解析

1. PHP_SELF

  • 返回當前執行腳本的路徑(相對文檔根目錄)。
  • 若 URL 以 / 結尾,自動補全 index.php。
  • 關鍵風險:包含 PATH_INFO 部分(如 /dir/test),直接輸出到 HTML 表單 action 會導致 XSS(攻擊者構造 /script.php/">)。
  • 必須配合 htmlspecialchars() 使用。

2. SCRIPT_NAME

  • 返回當前腳本的標準路徑(相對文檔根目錄),不包含 PATH_INFO 和查詢字符串。
  • 無論 URL 如何訪問(帶參數、帶 PATH_INFO),值固定為腳本實際路徑(如 /example/index.php)。
  • 最適合用於表單 action、生成當前頁鏈接、基礎路徑計算,安全性最高。

3. REQUEST_URI

  • 返回HTTP 請求行中的完整 URI(包含路徑、查詢字符串、PATH_INFO),不包含域名和協議。
  • 最原始、最完整,反映用戶真實訪問路徑。
  • 適合路由解析、日誌記錄、重定向目標構建、Canonical URL 生成。

最佳實踐建議

場景推薦變量處理方式
表單 actionSCRIPT_NAMEhtmlspecialchars($_SERVER['SCRIPT_NAME'])
當前頁完整鏈接(含參數)REQUEST_URI'https://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']
路由分發/框架入口REQUEST_URI解析 path、query、移除基礎路徑
生成 Canonical 標簽REQUEST_URI去除參數、統一斜杠
腳本自檢路徑SCRIPT_NAME直接比較

安全警示

<?php
// ❌ 危險:直接輸出 PHP_SELF 導致 XSS
echo '<form action="' . $_SERVER['PHP_SELF'] . '">';

// ✅ 安全:使用 SCRIPT_NAME + 轉義
echo '<form action="' . htmlspecialchars($_SERVER['SCRIPT_NAME']) . '">';

// ✅ 現代框架做法:使用路由組件生成 URL,不直接依賴 $_SERVER
echo '<form action="' . $router->url('current') . '">';
?>

理解三者語義邊界,選對變量、做好轉義,是 PHP Web 安全與路由正確性的基石。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved