2009-01-20 70 views
5

我有兩個運行PHP的Apache服務器。一個人接受查詢字符串向前斜線和以預期的方式將它傳遞到PHP,例如:如何配置Apache/PHP接受查詢字符串中的斜槓?

 
http://server/index.php?url=http://foo.bar 

作品和PHP這個表達式爲true:

$_REQUEST['url'] == "http://foo.bar" 

然而,在其他 Apache服務器,相同的URL導致403 Forbidden錯誤!請注意,如果查詢字符串的URL轉義正確(即使用%2F而不是正斜槓),則一切正常。

很明顯,Apache或PHP配置有一些不同,導致了這一點,但我無法弄清楚什麼!

我想接受這種形式的URL在這兩種情況下都不拒絕它。

+0

您是否檢查過日誌文件? – Gumbo 2009-01-20 17:02:54

+0

我99.9%確定我以前遇到過這個問題,但是我不記得我做了什麼來修復它。我現在四處尋找...... – 2009-01-20 17:02:59

回答

1

http://server/index.php?url=http://foo.bar是不是有效的URL。你必須編碼斜槓。我認爲瀏覽器會自動執行此操作,因此您可能正在使用不同的瀏覽器進行測試?

或者也許這是AllowEncodedSlashes的設置?

+8

查詢字符串中允許使用斜槓,按照RFC:http://www.ietf.org/rfc/rfc3986.txt – Sam152 2011-11-29 01:47:03

0

這聽起來像是另一種默認magic_quotes_gpc的情況。在服務器導致問題檢查php.ini並確保

magic_quotes_gpc = Off 
+0

事實上,這是關閉。 magic_quotes_runtime也是如此。 – 2009-01-20 17:44:31

0

你不指定PHP用這個URL做什麼。它是否重定向到此頁面或嘗試閱讀?

有可能是一些mod_rewrite規則刪除雙斜槓,或爲了某種其他目的,它試圖將其重定向到它不應該的地方。

也許正則表達式沒有^之前的http://

+0

PHP確實得到了頁面 - Apache拋出了403異常錯誤。 – 2009-01-22 02:35:17

0

請注意,如果查詢字符串的URL轉義正確(即使用%2F而不是正斜槓),則一切正常。

因此,它適用於查詢字符串正確格式化和不工作時不工作。有什麼問題?

7

這裏有幾個帖子建議OP的用法是錯誤的,這是假的。

擴展Sam152的評論,允許查詢字符串包含兩個?和/字符,請參閱http://www.ietf.org/rfc/rfc3986.txt的3.4節,這基本上是Tim Berners-Lee和朋友們關於如何運行網絡的規範。

問題是編寫不良(或配置不當或誤用)的解析器將查詢字符串斜槓解釋爲分隔路徑組件。

我已經看到PHP的pathinfo函數被用來解析URL的例子。 Pathinfo沒有寫入解析URL。但是,您可以使用parse_url提取路徑,然後使用fileinfo從路徑中檢索詳細信息。你會看到parse_url處理/和?在查詢字符串就好了。

在任何情況下,總體問題是這個領域對於全面的瞭解甚至在經驗豐富的開發人員中都知之甚少,而且大多數人(我自己包括到最近)只假定文件名後面的任何內容都必須被urlencoded,這是如果你把標準考慮進去,那麼這是明顯錯誤的。

tl; dr閱讀規範:)

相關問題