Apache2 使用 mod_rewrite, 使用方法如 此篇: Apache2 mod_rewrite 於 %2F (/) 的 Bug 修復.
除了 "/" 的問題外, 於 "&" 也會遇到問題.
Apache2 mod_rewrite 遇到 %26 (&) 問題修復
Apache2 的設定檔大致如下:
AllowEncodedSlashes On <IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^/product/(.*?)/?$ /product.php?id=$1&%{QUERY_STRING} [PT,L] </IfModule>
問題簡述
假設有個名稱是 "H&M", 於是網址就是如下:
- http://example.com/product/H&M/
經過 mod_rewrite 就會轉址成下述:
- /product.php?id=H&M
所以就只會抓到 id=H
解法1
於自己產生連結時, 兩次 urlencode().
<?php echo urlencode(urlencode($link)); ?>
解法2
因為這個狀況只會發生在 "&" 的狀況, 所以對 "&" 特別多處理一次即可.
<?php function get_link($link) { return urlencode(str_replace('&', '%26', $link)); } echo get_link($link); ?>
註: "+" (%2B) 也會遇到問題.
<?php function get_link_plus($link) { return urlencode(str_replace('+', '%2B', $link)); } echo get_link_plus($link); ?>
合併:
<?php function get_link($link) { return urlencode(str_replace(array('&', '+'), array('%26', '%2B'), $link)); } echo get_link($link); ?>
你應該用 QSA 而不是自己轉...
感謝長輩指點~ 但是剛剛測試 QSA. (http://httpd.apache.org/docs/current/rewrite/flags.html#flag_qsa)
說明是這樣:
RewriteRule /pages/(.+) /page.php?page=$1 [QSA]
/pages/123?one=two => /page.php?page=123&one=two
但是我的狀況是
/pages/H&M?one=two => /page.php?page=H&M&one=two
我是這樣子測試:
RewriteRule ^/product/(.*?)/?$ /product.php?name=$1&%{QUERY_STRING} [QSA,L]
但是看來遇到 "&" 還是會爛掉耶? 是我哪邊設定錯誤嗎?