我有一個包含以下內容的網址:阿帕奇:%25 URL(400錯誤的請求)
/somepath/morestuff/ohno%25foobar
出於某種原因,Apache是報告一個400錯誤的請求(它有事情做與%25) 。我正在使用mod_rewrite重寫指向我的codeigniter實例的路徑,但它甚至沒有進入codeigniter,它只是默認的apache錯誤。
任何想法?
我有一個包含以下內容的網址:阿帕奇:%25 URL(400錯誤的請求)
/somepath/morestuff/ohno%25foobar
出於某種原因,Apache是報告一個400錯誤的請求(它有事情做與%25) 。我正在使用mod_rewrite重寫指向我的codeigniter實例的路徑,但它甚至沒有進入codeigniter,它只是默認的apache錯誤。
任何想法?
我懷疑你是用PATH_INFO
來處理你的CodeIgniter請求。因此,您的.htaccess
文件中包含的規則集,類似於此:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ index.php/$0 [L]
當mod_rewrite
測試的URL,它們已經被解碼其自然字符格式,所以在這種情況下%25
已經變成了%
。當您應用此規則時,反向引用實際上包含文本文本somepath/morestuff/ohno%foobar
,這是默認情況下重新編碼的而不是。 Apache不知道%
在您的/index.php/somepath/morestuff/ohno%foobar
和扼流圈的請求路徑中正在做什麼,因此會出現此錯誤。
如果您正在運行Apache 2.2,mod_rewrite
爲此添加了B
標誌,允許您自動轉義重寫到您的URL的反向引用。它添加到您當前的標誌列表應該在這種情況下,解決這個問題:
RewriteRule ^.*$ index.php/$0 [B,L]
還有一個escape
RewriteMap
這可作爲的mod_rewrite
以前的Apache版本的內部地圖,但不幸的是這地圖有在啓用服務器或虛擬服務器配置級別,因此如果您在共享主機上運行您的網站,則可能無法使用。它做同樣的事情,雖然有點故意。
在您的服務器/虛擬服務器配置:
RewriteMap escape int:escape
然後,無論您定義的規則:
RewriteRule ^.*$ index.php/${escape:$0} [L]
請記住,笨不需要使用PATH_INFO
來獲得請求信息,如果您沒有使用mod_rewrite
進行任何其他轉換(並且完全避免此類頭痛),則在此處使用REQUEST_URI
是完全可以接受的。我認爲默認情況下,CodeIgniter被設置爲從AUTO
獲取請求(假設我沒有混淆我的框架),所以不要將請求重寫爲帶有路徑信息的URL就足以進行更改。
我正在運行apache 2.2,但那個B標誌沒有工作......它導致了一個500. – 2010-08-23 18:40:28
@Ken Struys - 你的錯誤日誌不得不說500關於什麼? – 2010-08-23 18:55:50
表示B標誌未知。我正在運行2.2.3和2.2.7添加了B標誌。我有完全訪問服務器(不共享主機),所以我可以做任何我需要做的阿帕奇。 – 2010-08-23 19:04:04
Apache 2.2.12+,只需使用B
標誌即可。否則,在這裏看到:
jQuery中設置的網址,你必須編碼這樣 這將編碼%和/前兩者..... 「是encodeURI(是encodeURI(encodeURIComponent方法( '你的字符串')));」
在PHP或查看頁面,你必須解碼像下面
urldecode(urldecode(用htmlspecialchars( '你的編碼字符串' ,ENT_QUOTES)))
是否有任何理由需要'%25'? '%25'是'%'符號的代碼。 – Powerlord 2010-08-23 17:14:33
@Bemrose,它實際上是一個人們可以發佈任何字符串的api。 – 2010-08-23 18:12:54