我试图找出为什么条件正则表达式在 apache 中永远不匹配,它不起作用吗?
<If "%{HTTP:MY-Header} =~ /(.+)/">
It should 匹配,因为
(.+)
字面上匹配所有内容,但是 if 块内的代码没有出现,因此它不匹配。我也尝试过m#(.+)#
,但也不起作用。我缺少什么吗?将 =~
替换为 !~
会使 if 块中的代码执行...
我也遇到过类似的问题,
<If>
和正则表达式试图只允许从我网站上的其他地方访问受保护的目录。 <If>
似乎只适用于文字字符串(即没有任何正则表达式)。
例如。将其放入受保护目录的 .htaccess 文件中:
<If "%{HTTP_REFERER} != 'https://example.com/valid_subdir'" >
Require all denied
</If>
将阻止除以下任何地方的所有访问
https://example.com/valid_subdir
如果这就是您想要的,那么很好 - 但在大多数情况下它限制太多,例如。尝试访问来自
https://example.com/another_subdir
将失败。就像“www”一样。被添加到前面,或者网站变成普通的“http”——如果托管平台发生变化,这两种情况都可能发生。
我通过设置环境变量并通过
<RequireAll>
验证访问来解决这个问题。是的,它很笨重,但遗憾的是很多阿帕奇人就是这样..
将其放入受保护目录的 .htaccess 文件中(注意。您仍然需要拼错“Referer”):
SetEnvIf Referer example\.com\/ isgood
# You can also stop bots with the following:
SetEnvIfNoCase User-Agent "bot|crawl|spid|slurp|cloud|admant|ltx|qwant" bad_bot
<RequireAll>
Require env isgood
# the next line will throw out bots, even if they munge the 'Referer'
Require not env bad_bot
</RequireAll>
如果合法用户点击 https://example.com/any_page(或 www.example.com/any_page,或 http://example.com/any_page)上的链接,他们会访问受保护的目录。任何从其他地方访问该目录的尝试都会收到错误 403。
HTH