我在.htaccess
中有一个重写规则 RewriteRule ^page/(.*)$ my-php-page.php?cid=$1
我传递的编码字符串包含=
和+
等字符 - 这是编码字符串;
V1ihnKpip6WpnY7Wm5zn2+6YUtLf2KCh4eKY
在完整的网址中
http://www.example.com/my-php-page.php?cid=V1ihnKpip6WpnY7Wm5zn2+6YUtLf2KCh4eKY
现在由于+
符号,这不起作用。所以我想发送cid
urlencoded然后成为;
http://www.example.com/my-php-page.php?cid=V1ihnKpip6WpnY7Wm5zn2%2B6YUtLf2KCh4eKY
+
符号变为%2B
。这很好用,除非我通过.htaccess中的RewriteRule尝试这个 - 它不起作用。所以URL将是
http://www.example.com/page/V1ihnKpip6WpnY7Wm5zn2%2B6YUtLf2KCh4eKY
由于某些原因,mypage.php文件实际上会收到cid
V1ihnKpip6WpnY7Wm5zn2 6YUtLf2KCh4eKY
,并用空格替换%2B
。
为什么它可能会这样做?我该如何解决呢?非常感谢你的帮助。
修改
我刚刚找到了这个解决方案 - PHP $_GET var with urlencode and "&" bug - 但我想知道.htaccess
中是否有一个更优雅的解决方案而不是两次urlencode
字符串?
答案 0 :(得分:9)
尝试添加B
重写标记。这个标志告诉mod_rewrite逃避反向引用,documentation says this:
_rewrite必须在映射URL之前对其进行unescape,因此反向引用将在应用它们时未转义。使用B标志,后向引用中的非字母数字字符将被转义。
由于%
字符是为RewriteCond
语句之前的RewriteRule
语句中匹配的分组的反向引用而保留的,因此mod_rewrite会以不同方式对其进行处理,最终可能会尝试替换%2
带有空白的反向引用。
所以你的规则应该是这样的:
RewriteRule ^page/(.*)$ my-php-page.php?cid=$1 [B]
答案 1 :(得分:0)
如果我理解正确,请重定向此网址:
http://www.example.com/page/V1ihnKpip6WpnY7Wm5zn2+6YUtLf2KCh4eKY
到这个
http://www.example.com/my-php-page.php?cid=V1ihnKpip6WpnY7Wm5zn2+6YUtLf2KCh4eKY
RewriteEngine On
RewriteRule ^page/([^/]*) http://www.example.com/my-php-page.php?cid=$1 [L]
结果是:
http://www.example.com/my-php-page.php?cid=V1ihnKpip6WpnY7Wm5zn2+6YUtLf2KCh4eKY
参数没有变化。