我想提供对来自 apache 正在运行的同一服务器的请求和 curl 请求的访问,但这部分不起作用,无论是第一个匹配还是第二个匹配。我做错了什么?
<LocationMatch "^/myLocation">
<If "%{HTTP_REFERER} == 'localhost'">
Require all granted
</If>
<ElseIf "%{USER_AGENT} =~ /curl/ >
Require all granted
</ElseIf>
<Else>
Require all denied
</Else>
</LocationMatch>
答案1
通常,您不应该基于HTTP_REFERER
标头或USER_AGENT
标头来设置访问控制;两者都是由网站访问者设置的,并且不可信,任何(恶意)用户都可以操纵它们。
其次,提供对来自同一服务器的请求的访问,这在一定程度上取决于您如何发出请求。
- 您是否正在发出请求
http://localhost/myLocation
- 那么请求也将来自本地主机,您可以根据 127.0.0.1 和/或 [::1] IP 地址进行访问控制。 - 您是否向外部 IP 发出请求,即
http://www.example.com/myLocation
您需要添加您的外部 IP 地址。
Apache httpd 不提供 if-then-else 结构,而是提供RequireAny
指令来实现你想要的:
<Location /myLocation>
<RequireAny>
Require ip 127.0.0.1
Require expr %{HTTP_REFERER} == 'localhost'
Require expr %{HTTP_USER_AGENT} =~ /curl/
</RequireAny>
</Location>