Apache2 mod_rewrite 於 %2F (/) 的 Bug 修復

現在大家都喜歡使用 /user/add, /user/list, /user/del ... 等等的網址, 若要於 Apache2 實現, 可以使用 mod_rewrite (rewrite) 實作.

但是 Apache2 的 mod_rewrite (RewriteRule) 在遇到 %2F 時, 於解析結果會和想像中的不同(%2F = /).

Apache2 設定

Apache2 設定如下述

<IfModule mod_rewrite.c>

RewriteEngine On

RewriteRule ^/s/(.*)$  /s?p=$1&%{QUERY_STRING} [PT,L]

RewriteRule ^/s$       /s?%{QUERY_STRING} [PT,L]

</IfModule>

依此設定說明: /s/xxx 等同於連到 /s.php?p=xxx (/s/xxx = /s.php?p=xxx)

範例

  • http://example.com/s/中文%2F測試 => 查不到結果(直接 404 Not Found 錯誤)
  • http://example.com/s/中文/測試 => 有結果
  • 中文%2F測試 預期應該收到 p=中文/測試, 但是收不到任何結果, 而且是直接出現 404 Not Found 的錯誤.

解法

解法1

於 urlencode 後, 把 "%2F"另外取代回 "/", 把這個直接包成另外一個 Function.


function url_encode($url)
{
return str_replace("%2F", "/", urlencode($url));
}

解法2

於上篇的留言中查到

If you have Apache >= 2.0.46, you can use the core directive
"AllowEncodedSlashes On" to allow %2F in urls

於 Apache2 設定檔中加入 AllowEncodedSlashes On 即可, 範例如下: (Apache2 版本要大於 2.0.46)

AllowEncodedSlashes On
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^/s/(.*)$  /s?p=$1&%{QUERY_STRING} [PT,L]
RewriteRule ^/s$       /s?%{QUERY_STRING} [PT,L]
</IfModule>

目前我是用 解法2 來解決囉~ 🙂

作者: Tsung

對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.

在〈Apache2 mod_rewrite 於 %2F (/) 的 Bug 修復〉中有 3 則留言

jaceju 發表迴響取消回覆

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料