$_SERVER['PHP_SELF'] 表示當前 php 文件相對於網站根目錄的位置地址,與 document root 相關。
假設我們有如下網址,$_SERVER['PHP_SELF']得到的結果分別為:
http://www.5idev.com/php/ :/php/index.php http://www.5idev.com/php/index.php :/php/index.php http://www.5idev.com/php/index.php?test=foo :/php/index.php http://www.5idev.com/php/index.php/test/foo :/php/index.php/test/foo
因此,可以使用 $_SERVER['PHP_SELF'] 很方便的獲取當前頁面的地址:
$url = "http://".$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'];
以上面的地址為例,得到的結果如下:
http://www.5idev.com/php/index.php
上面是簡單獲取 http 協議的當前頁面 URL ,只是要注意該地址是不包含 URL 中請求的參數(?及後面的字串)的。如果希望得到包含請求參數的完整 URL 地址,請使用 $_SERVER['REQUEST_URI'] 。
由於利用 $_SERVER['PHP_SELF'] 可以很方便的獲取當前頁面地址,因此一些程序員在提交表單數據到當前頁面進行處理時,往往喜歡使用如下這種方式:
<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
假設該頁面地址為:
http://www.5idev.com/php/index.php
訪問該頁面,得到的表單 html 代碼如下:
<form method="post" action="/php/index.php">
這段代碼是正確的,但是當訪問地址變成:
http://www.5idev.com/php/index.php/test/foo
頁面正常執行了,表單 html 代碼變成:
<form method="post" action="/php/index.php/test/foo">
顯然這段代碼不是我們期望的,攻擊者可以在 URL 後面隨意加上攻擊代碼。要解決該問題,可以:
$phpfile = basename(__FILE__); $_SERVER['PHP_SELF'] = substr($_SERVER['PHP_SELF'], 0, strpos($_SERVER['PHP_SELF'], $phpfile)).$phpfile;