2010-08-23 34 views
5

我有一個包含以下內容的網址:阿帕奇:%25 URL(400錯誤的請求)

/somepath/morestuff/ohno%25foobar 

出於某種原因,Apache是​​報告一個400錯誤的請求(它有事情做與%25) 。我正在使用mod_rewrite重寫指向我的codeigniter實例的路徑,但它甚至沒有進入codeigniter,它只是默認的apache錯誤。

任何想法?

+0

是否有任何理由需要'%25'? '%25'是'%'符號的代碼。 – Powerlord 2010-08-23 17:14:33

+0

@Bemrose,它實際上是一個人們可以發佈任何字符串的api。 – 2010-08-23 18:12:54

回答

11

我懷疑你是用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] 

還有一個escapeRewriteMap這可作爲的mod_rewrite以前的Apache版本的內部地圖,但不幸的是這地圖有在啓用服務器或虛擬服務器配置級別,因此如果您在共享主機上運行您的網站,則可能無法使用。它做同樣的事情,雖然有點故意。

在您的服務器/虛擬服務器配置:

RewriteMap escape int:escape 

然後,無論您定義的規則:

RewriteRule ^.*$ index.php/${escape:$0} [L] 

請記住,笨不需要使用PATH_INFO來獲得請求信息,如果您沒有使用mod_rewrite進行任何其他轉換(並且完全避免此類頭痛),則在此處使用REQUEST_URI是完全可以接受的。我認爲默認情況下,CodeIgniter被設置爲從AUTO獲取請求(假設我沒有混淆我的框架),所以不要將請求重寫爲帶有路徑信息的URL就足以進行更改。

+0

我正在運行apache 2.2,但那個B標誌沒有工作......它導致了一個500. – 2010-08-23 18:40:28

+0

@Ken Struys - 你的錯誤日誌不得不說500關於什麼? – 2010-08-23 18:55:50

+0

表示B標誌未知。我正在運行2.2.3和2.2.7添加了B標誌。我有完全訪問服務器(不共享主機),所以我可以做任何我需要做的阿帕奇。 – 2010-08-23 19:04:04

1

jQuery中設置的網址,你必須編碼這樣 這將編碼%和/前兩者..... 「是encodeURI(是encodeURI(encodeURIComponent方法( '你的字符串')));

在PHP或查看頁面,你必須解碼像下面

urldecode(urldecode(用htmlspecialchars( '你的編碼字符串' ,ENT_QUOTES)))