1

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

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

我正在传递一个包含字符=+编码字符串 - 这是编码字符串;

V1ihnKpip6WpnY7Wm5zn2+6YUtLf2KCh4eKY

当在完整的 URL 中时

http://www.example.com/my-php-page.php?cid=V1ihnKpip6WpnY7Wm5zn2+6YUtLf2KCh4eKY

现在这不起作用,因为+标志。所以我想发送cidurlencoded 然后变成;

http://www.example.com/my-php-page.php?cid=V1ihnKpip6WpnY7Wm5zn2%2B6YUtLf2KCh4eKY

符号+变为。%2B这很好用,除非我通过 .htaccess 中的 RewriteRule 尝试这个 - 它不起作用。所以网址是

http://www.example.com/page/V1ihnKpip6WpnY7Wm5zn2%2B6YUtLf2KCh4eKY

mypage.php 文件实际上接收到cidasV1ihnKpip6WpnY7Wm5zn2 6YUtLf2KCh4eKY由于某种原因替换%2B为一个空格。

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

编辑

我刚刚找到了这个解决方案——带有 urlencode 和“&”错误的 PHP $_GET var——但我想知道是否有.htaccessurlencode两次输入字符串更优雅的解决方案?

4

2 回答 2

9

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

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

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

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

RewriteRule ^page/(.*)$ my-php-page.php?cid=$1 [B]
于 2012-12-05T11:17:08.013 回答
0

如果我理解正确,重定向此 URL:

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

参数不变。

于 2012-12-05T11:35:10.677 回答