root.com/index rel
如果我有一个被编码的URL,root.com/index%20rel
我该如何使用 htaccess 文字符号来定位它?
=
表示字面意义上的国家。所以我做了类似的事情
RewriteCond %{REQUEST_URI} =index rel
RewriteRule .* / [L,R=302,]
但是 htaccess 认为空格会使事物成为一个额外的参数而不是同一参数的一部分。
逃跑似乎行不通
答案1
当使用字典顺序/文字比较(即=
运算符)时,你可以将整个条件模式如果字符串包含空格,则用双引号引起来。例如:
RewriteCond %{REQUEST_URI} "=index rel"
(该REQUEST_URI
变量已经百分比解码。)
但是,该条件仍然不匹配,因为REQUEST_URI
变量以斜杠开头(与匹配的 URL 路径不同)RewriteRule
图案)。因此,您需要:
RewriteCond %{REQUEST_URI} "=/index rel"
但是,正如 Unbeliever 所建议的,如果可能的话,您应该在RewriteRule
图案(如果您喜欢这种语法,也可以用双引号括起来)。RewriteRule
首先处理模式,因此在那里执行您可以执行的操作比在状况。
更新:在 Apache 2.2 (Windows 和 Linux) 和 Apache 2.4 (Windows) 上测试的工作示例:
RewriteCond %{REQUEST_URI} "=/foo bar"
RewriteRule ^ /baz [R=302,L]
的请求/foo%20bar
被重定向至/baz
。
答案2
RewriteCond
我很确定使用词汇比较(与 PCRE 相反)时目标模式中不能有空格,因为我认为“转义”是 PCRE 解释的内容。此外,由于 aRewriteRule
与请求 URI 匹配,因此您不需要 a。请改用以下内容:
重写规则 ^index\ rel$ / [L,R=302]