2012-09-13 62 views
4

Apache有一個非常惱人的傾向,用單一URL替換URL中的雙斜槓。如何防止apache在URL路徑中使用單斜槓減少雙斜線?

例子:

請求URL:http://example.com/myscript.php/foo//bar

當我看

$_SERVER['PATH_INFO']; 

變種,路徑信息將顯示爲:

foo/bar 

,而不是

foo//bar 

有沒有人知道這個問題的解決辦法?我相信這是根深蒂固的apache的功能...我不知道是否有某種可以調整,以禁用此行爲的apache標誌。

+2

爲什麼要保留雙斜槓? ...另外我很確定這是瀏覽器修復它,因爲它無效的網址... – Erik

+0

@Erik不是瀏覽器。該網址無效。此實例中的雙斜槓是_additional path information_(PATH_INFO)的一部分,它是跟蹤現有(有效)URL的URL部分。 – MrWhite

回答

0

它是解析URI的RFC標準的一部分,所以你不能改變它。

甚至在將請求發送到遠程服務器之前,您的瀏覽器可能會標準化URI。

+0

呃,我很害怕答案會是這樣的......哦,好吧。煩人。 – Eugene

+0

你可以轉義字符/並將其替換爲ASCII值,請參閱urlencode() – Maks3w

+0

是的,這是我要去的路線... – Eugene

0

nginx有一個merge_slashes指令,允許合併斜線以匹配位置,並且默認爲關閉,這意味着默認情況下它不合並。如果在RFC中指定了合併行爲,那麼nginx肯定不會遵循。

0

http://example.com/myscript.php/foo//bar

/foo//bar是遵循的實際文件名其他路徑信息。雖然Apache確實減少了PATH_INFO服務器變量(傳遞給相應的PHP超全局變量)中的多個斜線,但原始URL(帶有多個斜槓)在$ _SERVER ['PHP_SELF']變​​量中仍然可用。

因此,而不是通過PATH_INFO變量訪問路徑信息,你可以不喜歡以下代替:

$pathInfo = str_replace($_SERVER['SCRIPT_NAME'],'',$_SERVER['PHP_SELF']); 

這僅僅去除PHP_SELF的SCRIPT_NAME,留下路徑信息(如果任何)。你可以使用REQUEST_URI而不是PHP_SELF,但是這包括查詢字符串,所以你需要檢查這個。

因此,鑑於上述要求,其中SCRIPT_NAME是「/myscript.php」和PHP_SELF是「/myscript.php/foo//bar」,然後將所得$pathInfo是「/富//欄」。

相關問題