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

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);
?>

相關網頁


關於 Tsung

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

本篇發表於 My_Note-Programming 並標籤為 , , 。將永久鏈結加入書籤。

Apache2 mod_rewrite 遇到 %26 (&) 問題修復 有 3 則回應

  1. gslin 說道:

    你應該用 QSA 而不是自己轉...

  2. 通告: URL rewrite 的 + 與 的問題 - Tsung's Blog

發表迴響