現在大家都喜歡使用 /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 來解決囉~ 🙂