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

问题描述 投票:0回答:1

我试图找出为什么条件正则表达式在 apache 中永远不匹配,它不起作用吗?

<If "%{HTTP:MY-Header} =~ /(.+)/">

It should 匹配,因为

(.+)
字面上匹配所有内容,但是 if 块内的代码没有出现,因此它不匹配。我也尝试过
m#(.+)#
,但也不起作用。我缺少什么吗?将
=~
替换为
!~
会使 if 块中的代码执行...

regex apache apache2.4
1个回答
0
投票

我也遇到过类似的问题,

<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

© www.soinside.com 2019 - 2024. All rights reserved.