迷失在RewriteRule翻译中

时间:2011-04-09 22:17:18

标签: apache mod-rewrite

这是我第一次遇到这个问题,而且我已经和Apache合作了大约13年了。

我有这个重写规则:

RewriteRule ^ / tagged /(.*)/$ /index.php?a=tagged&tags=$1

很简单吧? 这是交易:如果“标签”的值包含urlencoded字符 - 它们只是在翻译中丢失。走了,再见!?

如果我输入这样的url:/ tagged / c%2B%2B /这是urlencode c ++的方法 然后index.php接收tags = c的值 我的++去了哪里?

当我直接在网址中输入c%2B%2B时,如下所示: /index.php?a=tagged&tags=c%2B%2B然后一切都很好,很高兴找到标记为c ++的帖子

这是一个已知问题吗?什么是解决方法?

2 个答案:

答案 0 :(得分:1)

我遇到的问题与此非常相似。这是我用来解决它的link。问题是,正如链接所暗示的那样,当mod_rewrite执行其规则时,Apache已经没有使用URL,因此当您重写PHP脚本的URL时,PHP会将+解释为空格。

编辑:帖子已更新:

  

2009年8月24日更新:Apache 2.2.12包含RewriteRule的B标志,用于解决此问题。它是在2.2.7中引入的,但如果我正确读取了更改日志,则会一直打到2.2.12。感谢Michael Stillwell让我知道。

答案 1 :(得分:0)

您是否尝试使用

RewriteRule ^/tagged/(.*)/$ /index.php?a=tagged&tags=$1 [NE]

NE代表NoEscape。从来没有使用它,所以不知道它是否只是没有转义尚未urlencoded的字符,或只是写非urlencoded字符并转换那些。