出于测试目的,我有一个受密码保护的网站克隆,可以使用dev.example.com
这样的子域进行访问。我使用的是basic authentication
,所有流量都应使用https
进行转移。因此,使用http
的任何请求必须在身份验证之前重定向到https
。我尝试过以下.htaccess
文件。
RewriteEngine On
# Rewrite any requests to ip addresses or *.example.com to dev.example.com
RewriteCond %{HTTP_HOST} !^dev\.example\.com$ [NC]
RewriteCond %{THE_REQUEST} \s(\S*)\s
RewriteRule ^ https://dev.example.com%1 [L,NE,R=302]
# Rewrite to https
RewriteCond %{HTTPS} off
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=302]
# Require authentication
AuthName "Restricted development environment"
AuthType Basic
AuthUserFile /var/www/html/.htpasswd
Require valid-user
我同时检查%{HTTPS}
和%{HTTP:X-Forwarded-Proto}
以支持客户端直接连接服务器的情况,以及服务器位于负载均衡器后面的情况,以及负载均衡器和服务器之间的流量正在使用http
。
这个想法是[L]
flag应该导致重定向在身份验证之前发生,但似乎并非如此。访问http://dev.example.com
时,会弹出身份验证。如果我正确输入凭据,我会重定向到https://dev.example.com
,然后会再次显示身份验证。
我发现这个类似question,其中未使用[L]
标志。建议的解决方案是在https
正在使用时设置环境变量,并且仅在设置该变量时允许访问。但我不明白为什么我不能只使用[L]
标志。也许我误解了它的用法和意义。使用[L]
标志时,为什么在验证之前没有完成重定向?
答案 0 :(得分:0)
似乎不同的Apache模块独立工作,[L]
标志不会阻止身份验证发生,尽管文档说Use this flag to indicate that the current rule should be applied immediately without considering further rules.
我最终将身份验证包装在If
指令中,检查连接是否安全。
如果连接不安全,则不执行身份验证,并重定向请求。重定向后,连接是安全的,并执行身份验证。
# Require authentication
# If the connection is not secure, authentication is postponed
<If "%{HTTPS} = 'on' || %{HTTP:X-Forwarded-Proto} = 'https'">
AuthName "Restricted development environment"
AuthType Basic
AuthUserFile /var/www/html/.htpasswd
Require valid-user
</If>