【问题标题】:.htaccess rewriterule - substitution from rewritecond the_request.htaccess rewriterule - 从 rewritecond the_request 替换
【发布时间】: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


【解决方案1】:

匹配的表达式应该在括号(.*) 中,然后它应该显示在$1 中。

顺便说一句,您真的想要重定向吗,因为这会返回到可能在重定向之前再次转义的设备。您可能想要通过 [PT] 或其他方式进行传递。

【讨论】:

  • 你的意思是 rewriterule 中的 .* 吗?
  • 另外,我还没有看到设备重新转义的案例。
  • RewriteRule /viewtopic\.php\%3Ft\%3D(.*)$ http://www.mydomain.com/viewtopic.php?t=$1 [R=301,L](未测试)
  • AFAIK,您无法以这种方式匹配编码字符。另外,我想匹配一个数字,而不是任何字符。
  • 更具体地说,当 RewriteRule 正在查看它时,%3F 和 %3D 将被解码为 ?和=,因此规则不会被执行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-16
  • 2016-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多