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

Was*_*sim 1 php apache .htaccess mod-rewrite urlencode

我在.htaccess中有一个重写规则

RewriteRule ^page/(.*)$ my-php-page.php?cid=$1

我传递的编码字符串包含像=和的字符+- 这是编码的字符串;

V1ihnKpip6WpnY7Wm5zn2+6YUtLf2KCh4eKY

当它在完整的URL中时

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为空格.

任何想法为什么它可能会这样做?我该如何解决呢?非常感谢您的帮助.

编辑

我刚刚找到了这个解决方案 - 带有urlencode和"&"bug的PHP $ _GET var - 但是我想知道是否有更优雅的解决方案而.htaccess不是urlencode两次使用字符串?

Jon*_*Lin 9

尝试添加B重写标志.这个标志告诉mod_rewrite逃避反向引用,文档说这个:

_rewrite必须在映射URL之前对其进行unescape,因此反向引用将在应用它们时未转义.使用B标志,后向引用中的非字母数字字符将被转义.

由于该%字符被保留用于对在RewriteCond前面的语句中匹配的分组进行反向引用RewriteRule,因此mod_rewrite以不同方式处理它们,并且可能最终尝试%2用空白反向引用替换它.

所以你的规则应该是这样的:

RewriteRule ^page/(.*)$ my-php-page.php?cid=$1 [B]
Run Code Online (Sandbox Code Playgroud)