2009-06-11 43 views
17

是否有任何簡單的方法來識別最初處理請求的文件,忽略獲取參數和處理(至少基本)映射,如//index.php如何識別PHP中的請求頁面

理想情況下,我在找的是類似$_SERVER['REQUEST_URI']的東西,不同之處在於它返回相同的值,而不管get參數是多少,該值是請求的文件,而不是URI,也不是當前正在執行的文件($_SERVER['PHP_SELF'])。換句話說,一個$_SERVER['REQUESTED_FILE']什麼的。我沒有見過這樣的事情。它是否存在,還是我需要手動編寫一些東西?

更新 這裏是什麼,我想結果是成對的一些示例網址:

example.com/mypage.php  : /mypage.php 
example.com/     : /index.php 
example.com/foo/?hello=world : /foo/index.php 

而且這些返回值是真實的,即使在所有的包含文件。在回答之前看到我的答案,我想我已經找到了我正在尋找的東西。

+0

你可以更新你的問題,並添加一個你正在尋找什麼假設的例子?目前還不清楚您對請求URL(http://example.org)或用於提供請求的文件(/var/www/.../index.php)是否感興趣 – Shoan 2009-06-12 03:00:35

回答

23

我決定測試一下自己。 $_SERVER['SCRIPT_NAME']變量提供了所請求文件的路徑,即使它是索引文件,也沒有獲取參數或其他內容。 PHP文檔指出這包含該文件的路徑,但它似乎與文檔根相關,就像PHP_SELF一樣,但沒有安全漏洞。

這裏是我用來測試這個代碼:請求example.com/?foo=barhttps://gist.github.com/dimo414/5484870

輸出:

__FILE__:    /var/www/index.php 
PHP_SELF:    /index.php 
SCRIPT_NAME:   /index.php 
REQUEST_URI:   /?foo=bar 
parse_url(REQUEST_URI):/


__FILE__:    /var/www/pathtest.php 
PHP_SELF:    /index.php 
SCRIPT_NAME:   /index.php 
REQUEST_URI:   /?foo=bar 
parse_url(REQUEST_URI):/

和輸出請求example.com/index.php/<strong>XSS</strong>時:

__FILE__:    /var/www/index.php 
PHP_SELF:    /index.php/XSS # note the XSS exploit (this is bold in browser) 
SCRIPT_NAME:   /index.php  # No exploit here 
REQUEST_URI:   /index.php/%3Cstrong%3EXSS%3C/strong%3E 
parse_url(REQUEST_URI): /index.php/%3Cstrong%3EXSS%3C/strong%3E 


__FILE__:    /var/www/pathtest.php 
PHP_SELF:    /index.php/XSS 
SCRIPT_NAME:   /index.php 
REQUEST_URI:   /index.php/%3Cstrong%3EXSS%3C/strong%3E 
parse_url(REQUEST_URI): /index.php/%3Cstrong%3EXSS%3C/strong%3E 

正如你所看到的,$_SERVER['SCRIPT_NAME']總是回送最初處理請求的文件,即URL中的文件,智慧如果沒有XSS風險。

+0

值得注意的是,如果你使用某種類型的MVC或前端控制器方法,那麼「SCRIPT_NAME」將返回提供包含的腳本,因此如果所有內容都通過index.php例子運行,這將返回 - 在這種情況下,$ _SERVER ['REQUEST_URI']似乎做的伎倆。 – 2014-01-07 16:12:09

+2

@MthethewRiches注意到`REQUEST_URI`與'SCRIPT_NAME`有不同的用途 - 前者是用戶請求的URI,包括GET參數,其中`SCRIPT_NAME`故意不是服務器上的路徑。如果您在MVC庫中工作,則應該查看庫的文檔以瞭解如何最好地識別實際請求的文件。 – dimo414 2014-01-07 16:22:59

-1

它的很老的問題,也不是很清楚。 我的理解是你想知道哪個頁面正在發送請求GET/POST。這可以通過實現:

$ _ SERVER [ 'HTTP_REFERER']

現在,獲得實際的頁面名稱,這樣寫: =基本名($ _ SERVER [ 'HTTP_REFERER']);

這會解決您的疑慮。

+0

不,問題絕不會詢問HTTP引用者。這將(設置時)指示用戶之前在哪個頁面上引用了此頁面。問題是要求當前正在請求的文件,並且接受的答案表明它是`$ _SERVER ['SCRIPT_NAME']`。 – dimo414 2016-04-12 15:46:58

0

從請求的URL獲取文件名使用以下代碼。

basename($_SERVER['URL']); 
basename($_SERVER['REQUEST_URI']); 
basename($_SERVER['SCRIPT_NAME']); 
basename($_SERVER['SCRIPT_FILENAME']); 
basename($_SERVER['REQUEST_URI']); 
basename($_SERVER['PATH_TRANSLATED']); 
basename($_SERVER['PHP_SELF']); 

在嵌套if條件中使用任何一個所有這些,所以你不會錯過任何如何的文件名。