我正在设置一个全新的服务器 — 我实际上只是启动了一个 AWS EC2 实例,全新安装了 apache 和 mod_ssl,并且配置接近最简单的配置。Apache 似乎忽略了块LogLevel
中的任何身份验证配置(包括) 。VirtualHost
这是 amzn2.x86_64 Linux 上的 Apache 2.4.51。
我首先将 HTTP 重定向到 HTTPS,然后按照以下基本说明进行操作Apache 2.4 身份验证和授权. 这让我得到了以下 virtual.conf:
<VirtualHost _default_:80>
DocumentRoot /var/www/html
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteCond %{HTTP_HOST} !^(localhost|127.0.0.1)
RewriteRule ^/(.*) https://%{HTTP_HOST}/$1 [R,L]
</VirtualHost>
<VirtualHost *:443>
LogLevel debug
SSLEngine on
SSLCertificateFile /etc/pki/tls/certs/ca.crt
SSLCertificateKeyFile /etc/pki/tls/private/ca.key
<Directory "/var/www/html">
AllowOverride All
Options Indexes FollowSymLinks
AuthType Basic
AuthName "Restricted Files"
# (Following line optional)
AuthBasicProvider file
AuthUserFile "/mount/local/apache/passwd/passwords"
Require user someuser
</Directory>
DocumentRoot /var/www/html
</VirtualHost>
总体而言,上述操作似乎有效,但身份验证除外。如果我在 Web 浏览器中访问我的 IP 地址,它会正确重定向到 443,它会从指定的(非标准)路径提供证书,并且我可以看到它记录debug
级别活动,至少对于 mod_ssl 而言。但是,它只从/var/www/html/
(注意::/var/www/html
是一个符号链接)。
我发现另一个问题,这促使我去寻找任何Require all granted
指令。
# pwd
/etc/httpd/conf.d
# grep Require * 2>/dev/null
autoindex.conf:# Required modules: mod_authz_core, mod_authz_host,
autoindex.conf: Require all granted
ssl.conf:# With SSLRequire you can do per-directory access control based
ssl.conf:#SSLRequire ( %{SSL_CIPHER} !~ m/^(EXP|NULL)/ \
ssl.conf:# o StrictRequire:
ssl.conf:# This denies access when "SSLRequireSSL" or "SSLRequire" applied even
ssl.conf:#SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire
userdir.conf: Require method GET POST OPTIONS
virtual.conf: Require user someuser
welcome.conf: Require all granted
中的那个autoindex.conf
位于<Directory "/usr/share/httpd/icons">
块内,而 中的那个welcome.conf
位于 中<Directory /usr/share/httpd/noindex>
。我做过查找一个/etc/httpd/conf/http.conf
:
# Further relax access to the default document root:
<Directory "/var/www/html">
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
注意,在此安装中(通过yum
Amazon Linux 2),主配置文件是/etc/httpd/conf/http.conf
。该文件的最后一行是IncludeOptional conf.d/*.conf
。我上面发布的主要配置在/etc/httpd/conf.d/virtual.conf
。
我尝试注释掉它Require all granted
并重新启动服务器,但没有变化。那时我注意到它似乎根本没有做任何事情。前面提到的问题显示了他的日志文件中的一些条目。但是,即使我有,我也没有在日志文件中LogLevel debug
看到任何与它相关的内容,就像他一样。¯_(ツ)_/¯authz_core
此时,我尝试在<VirtualHost>
块内部进行一些修改:
- 我尝试将线条包裹
AuthType basic
在Require user someuser
一个<RequireAll>
块中 - 我尝试
Require all denied
在之前添加Require user
- 我尝试使用
.htaccess
具有相同配置的文件 - 我尝试改变
AllowOverride All
并AllowOverride All AuthConfig
使用.htaccess
文件 - 我尝试将日志记录扩展到
LogLevel debug auth_basic:trace1 authz_core:trace1
在所有情况下,均无变化,配置解析正常。服务器仅提供页面,日志文件中没有任何内容。
然而conf/httpd.conf
,如果我在块内的主文件中进行更改<Directory "/var/www/html">
,则一切将按预期进行:
- 更改
Require all granted
为Require all denied
(而不是注释掉)会阻止所有访问 - 更改
AllowOverride none
为AllowOverride AuthConfig
使我的.htaccess
文件具有与块中相同的身份验证配置,<VirtualHost>
按预期工作 - 它要求用户名和密码 - 使用日志记录
LogLevel debug auth_basic:trace1 authz_core:trace1
可以让我记录很多日志
因此,总而言之,即使我的<VirtualHost>
配置通常可以正常工作(重定向、SSL、除身份验证之外的所有内容的调试),但它似乎会默默地忽略任何auth
配置,包括LogLevel
。
在短期内,我通过撤消我在主配置文件中所做的所有更改解决了我的问题,因此在软件更新期间不会覆盖这些更改,然后将它们放入conf/00-override.conf
:
<Directory "/var/www/html">
AllowOverride All
AuthType Basic
AuthName "Restricted Files"
# (Following line optional)
AuthBasicProvider file
AuthUserFile "/mount/local/apache/passwd/passwords"
Require user someuser
</Directory>
但是,如果能够在虚拟主机级别配置授权就更好了。有什么想法吗?