![RewriteMap 未按预期工作](https://linux22.com/image/198251/RewriteMap%20%E6%9C%AA%E6%8C%89%E9%A2%84%E6%9C%9F%E5%B7%A5%E4%BD%9C.png)
我试图阻止对某些网址的访问:
https://example.com/questions/topic
我有一个 blacklist.txt 文件,其中包含以下内容:
questions/topic deny
然后我的配置如下:
RewriteMap access txt:path_to_blacklist.txt
RewriteCond ${access:%{REQUEST_URI}} deny [NC]
RewriteRule .* - [F,L]
但我发现我仍然可以打开https://example.com/questions/topic通常情况下,但是当我尝试使用以下配置而不是 RewriteMap 时:
RewriteCond %{REQUEST_URI} questions/topic [NC]
RewriteRule .* - [F,L]
它工作成功,但我无法访问该网址。那么如何使用 RewriteMap 达到相同的结果?
答案1
这是一个“在背后咬自己”的疏忽:${REQUEST_URI}
包括租赁削减。如果你有
/questions/topic deny
在你的文件中,你应该没问题。 (RewriteMap 确实精确匹配用于键查找;当您questions/topic
显式地将您放入 RewriteCond 中时,它是一个正则表达式匹配,并且由于它没有用^
and/or锚定$
,因此在您的情况下可以归结为子字符串匹配。)
作为个人品味的问题:由于您RewriteRule
没有对匹配进行任何操作,因此您可以编写“匹配任何内容”RewriteRule ^
而不是RewriteRule .*
“匹配任何内容”。前者可能更快,因为它不需要查看字符串,where.*
是贪婪的并且会读取所有字符串。