【发布时间】:2012-11-19 15:03:00
【问题描述】:
我有一个留言板,其中偶尔会出现带有编码字符的请求,如果未设置重定向,访问者会收到 404 响应。
例如,主题 #309 的请求以 viewtopic.php%3Ft%3D309 的形式出现,而不是 viewtopic.php?t=309
所以我有一个重定向设置如下:
# Redirect from calls to incorrect topic constructs to the actual topic link
RewriteCond %{THE_REQUEST} viewtopic\.php%3Ft%3D([0-9]+)
RewriteRule .* http://www.example.com/viewtopic.php?t=%1 [R=301,L]
我查看 %{THE_REQUEST} 因为它是查看带有编码的请求的唯一方法。然后我选择 %3D(= 符号)之后的一位或多位数字作为替换。
发生的事情是,根据我的日志,重写条件正在匹配,并且重写器被触发,但它重定向到
http://www.example.com/viewtopic.php?t=
即替换不填主题号。
在此问题之前,我之前没有遇到过用 rewritecond 替换(通过 %1、%2 等)的任何问题。替换 %{THE_REQUEST} 有什么特别之处还是我遗漏了什么?
在 Linux 上运行 Apache 2.2.22。
【问题讨论】:
-
尽量避免使用
THE_REQUEST... 在这种情况下调试REQUEST_URI中的内容,并根据REQUEST_URI和/或QUERY_STRING进行重写。顺便提一句。这很奇怪,因为至少一位数字必须在比赛结束后在%1中。您确定这些 URL 已被您在问题中引用的规则重写了吗? -
这样做的问题是这些其他变量会解码请求或查询字符串。如果它被解码,我没有办法处理它——因为如果它被解码,它看起来就像一个正常的请求。
-
“你确定...?”的答案是是的。没有其他可能的重写可以做到这一点。这是一个非常具体的重写。
-
我知道
THE_REQUEST的内容——我的意思是,它必须被解码为变量,并且它们必须有一些内容——甚至编码错误。然后你可以抓住它......顺便说一句。在我的系统上,当我将GET /viewtopic.php%3Ft%3D12 HTTP/1.0作为请求时,mod_rewrite以正常方式工作...解码是正确的。 -
在这种情况下,我不想匹配请求的解码版本,因为解码版本看起来很正常。如果我检查解码版本,它不会重写,然后用户会得到 404 响应。
标签: .htaccess mod-rewrite request substitution