Apache2 mod_rewrite 遇到 %20 和 加號混合的解法

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)

相關網頁

作者: Tsung

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

發表迴響

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