.htaccess url编码的字符串没有正确传递给页面

时间:2012-12-05 10:06:40

标签: php apache .htaccess mod-rewrite urlencode

我在.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字符串?

2 个答案:

答案 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

参数没有变化。