Apache2 mod_rewrite 遇到 %26 (&) 問題修復

Apache2 使用 mod_rewrite, 使用方法如 此篇: Apache2 mod_rewrite 於 %2F (/) 的 Bug 修復.

除了 "/" 的問題外, 於 "&" 也會遇到問題.

Apache2 mod_rewrite 遇到 %26 (&) 問題修復

Apache2 的設定檔大致如下:

  1. AllowEncodedSlashes On
  2. <IfModule mod_rewrite.c>
  3. RewriteEngine On
  4. RewriteCond %{REQUEST_FILENAME} !-d
  5. RewriteCond %{REQUEST_FILENAME} !-f
  6. RewriteRule ^/product/(.*?)/?$  /product.php?id=$1&%{QUERY_STRING} [PT,L]
  7. </IfModule>

問題簡述

假設有個名稱是 "H&M", 於是網址就是如下:

  • http://example.com/product/H&M/

經過 mod_rewrite 就會轉址成下述:

  • /product.php?id=H&M

所以就只會抓到 id=H

解法1

於自己產生連結時, 兩次 urlencode().

  1. <?php
  2. echo urlencode(urlencode($link));
  3. ?>

解法2

因為這個狀況只會發生在 "&" 的狀況, 所以對 "&" 特別多處理一次即可.

  1. <?php
  2. function get_link($link)
  3. {
  4. return urlencode(str_replace('&', '%26', $link));
  5. }
  6. echo get_link($link);
  7. ?>

註: "+" (%2B) 也會遇到問題.

  1. <?php
  2. function get_link_plus($link)
  3. {
  4. return urlencode(str_replace('+', '%2B', $link));
  5. }
  6. echo get_link_plus($link);
  7. ?>

合併:

  1. <?php
  2. function get_link($link)
  3. {
  4. return urlencode(str_replace(array('&', '+'), array('%26', '%2B'), $link));
  5. }
  6. echo get_link($link);
  7. ?>

相關網頁

作者: Tsung

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

在〈Apache2 mod_rewrite 遇到 %26 (&) 問題修復〉中有 3 則留言

    1. 感謝長輩指點~ 但是剛剛測試 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]

      但是看來遇到 "&" 還是會爛掉耶? 是我哪邊設定錯誤嗎?

發表迴響

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