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两次使用字符串?
尝试添加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)