Apache条件正则表达式无法匹配

ss2ws0br  于 2023-10-23  发布在  Apache
关注(0)|答案(1)|浏览(143)

我想弄明白为什么条件正则表达式在apache中永远不匹配,它不工作吗?
<If "%{HTTP:MY-Header} =~ /(.+)/">
它应该匹配,因为(.+)实际上匹配所有内容,但是if块中的代码没有出现,所以它不匹配。我也试过m#(.+)#,但它也不工作。我是不是漏掉了什么?将=~替换为!~会使if块中的代码执行.

n3schb8v

n3schb8v1#

我也遇到过类似的问题,<If>和regex试图只允许从我网站上的其他地方访问受保护的目录。<If>似乎只适用于文字字符串(即。没有regex)。
例如,将其放入受保护目录的.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

相关问题