PHP 的 urlencode 有兩種:
- rawurlencode('c & c++'); // 20%26%20c%2B%2B
- urlencode('c & c++'); // c+%26+c%2B%2B
- 由上述看到主要差異在於空白(%20 vs +),+ 會被轉成 %2B
平常使用 urlencode() / rawurlencode() 在 Apache rewrite 轉回來都不會有問題,但是從其它程式語言來得,有遇到同時有 %20 和 +,但是這些在 Apache 端都會被轉成空白讓 PHP 吃,該怎麼避免 + 被轉成空白呢?
Apache2 mod_rewrite 遇到 %20 和 加號混合的解法
原本的 Rewrite Rule 如下:
- RewriteRule ^/test/(.*?)$ /test.php?q=$1%{QUERY_STRING} [PT,L]
想要讓 %20 等符號轉換,但是 + 等特殊符號不轉換,可以加上 B,詳見:mod_rewrite - Apache HTTP Server Version 2.4
修改成下述:
- RewriteRule ^/test/(.*?)$ /test.php?q=$1%{QUERY_STRING} [B,PT,L]
這樣子於網址列打 C & C++,C++ 就可以正常被保留下來了。(不然會變成 C & C)