我正在尝试创建对所有 IP 地址关闭的 Apache 虚拟主机,但一个 IP 地址和两个应该可公开访问的 URL 除外。
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName example.com
ServerAdmin [email protected]
DocumentRoot "/var/www/example.com/app/webroot"
<Directory "/var/www/example.com/app/webroot">
Options FollowSymLinks Includes ExecCGI
AllowOverride All
ErrorDocument 403 "https://example.com/403.php"
DirectoryIndex index.php
</Directory>
<Location "/foo/bar/">
Require all granted
</Location>
<Location "/.well-known/">
Require all granted
</Location>
<Location "/">
Require ip 1.2.3.4
</Location>
SSLProxyEngine on
ProxyPreserveHost On
ProxyRequests Off
ProxyPass /api/ https://host.docker.internal:8443/api/ connectiontimeout=5 timeout=300
ProxyPassReverse /api/ https://host.docker.internal:8443/api/
SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>
我尝试更改Location
标签的顺序,但所有请求都被重定向到ErrorDocument
指令值。
URL由located in/foo/bar/
重写(出于测试目的,我尝试删除但没有效果)。.htaccess
DocumentRoot
.htaccess
阿帕奇版本:
- 服务器版本:Apache/2.4.59(Debian)
- 服务器建成:2024-04-05T12:02:26
Apache 运行在 Docker 容器中,但它可能对问题没有任何意义。
问:配置有什么问题?
Location
章节顺序错误根据Apache 2.4官方文档,
<Location>
节按照它们在配置文件中出现的顺序进行处理,在<Directory>
节和.htaccess
文件读取之后,在<Files>
节之后。该部分
Require ip 1.2.3.4
中的<Location "/">
仅限对该 IP 的访问,但其他<Location>
部分应针对特定路径覆盖此设置。正确的顺序应该是:Location
带有尾部斜杠/
/
另一个问题可能是指定位置末尾的斜杠。根据Apache 2.4 官方文档,如果 URL 的路径部分满足以下任一条件,则所附指令将应用于请求:在下面的示例中,如果没有使用尾部斜杠,则请求
/private1
、/private1/
和/private1/file.txt
将应用所包含的指令,但/private1other
不会。在下面的示例中,使用尾部斜杠时,请求
/private2/
和/private2/file.txt
will 应用所包含的指令,但/private2
和/private2other
不会应用。我的配置有两个问题:
正如@sotirov 提到的,
<Location>
标签按存在顺序进行处理 - 正确的顺序应该是:限制对某些 IP 地址的所有访问,并通过以下<Location>
标签允许访问指定位置。重写的 URL - 我的 url
/foo/bar/
被重写为.htaccess
toindex.php
,在这种情况下,URL 与位置不匹配<Location "/foo/bar/">
。当我使用真实的物理文件<Location "/foo.bar">
位置标记时,它会按预期工作。