我想强制使用 https 和基本身份验证来输出服务器状态 (mod_status)。如果我启用身份验证,并且用户要求http://site/server-status
apache 首先要求通过,然后重定向到 httpS,然后再次要求通过。
这个问题类似于 Apache - AUTH 之前重定向到 https 和 在 .htpasswd 之前强制使用 apache 的 https 但我无法让它工作,因为我们谈论的不是通用文件夹而是位置结构。
我的配置(简要)如下:
<Location /server-status>
SSLRequireSSL
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteBase /server-status
RewriteCond %{HTTPS} off
RewriteCond %{SERVER_PORT} 80
RewriteRule ^ - [E=nossl]
RewriteRule (.*) https://site/server-status} [R=301,L]
</IfModule>
SetHandler server-status
Order deny,allow
Deny from all
Allow from localhost ip6-localhost
Allow from 1.2.3.0/24
Allow from env=nossl
AuthUserFile /etc/httpd/status-htpasswd
AuthName "Password protected"
AuthType Basic
Require valid-user
Satisfy any
</Location>
我认为Allow from env=nossl
应该允许每个人使用RewriteCond %{HTTPS} off
服务器端口 80,然后强制其重定向,但它不起作用。
请注意,我不想强制 SSL 整个网站,而只想 SSL /server-status。如果服务器有多个网站,那就有关系了。
我做错了什么?谢谢。
答案1
有没有办法将 HTTP 和 HTTPS 分成两个虚拟主机?您可以只在 HTTPS 上进行身份验证,并将 HTTP 重定向到 HTTPS。完整配置如下所示。
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
Redirect / https://example.com/
</VirtualHost>
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName example.com
ServerAlias www.example.com
.
.
.
</VirtualHost>
</IfModule>
答案2
我没有太多的运气找到RewriteCond %{HTTPS} off
工作——相反,对我有用的是
RewriteCond %{SERVER_PORT} !443
另一个建议(从这个问题)将把 Auth 行移到一个<VirtualHost *:443>
部分中。