使用L-flag时,为什么在验证之前没有重定向?

时间:2017-09-15 09:00:33

标签: apache .htaccess authentication redirect mod-rewrite

出于测试目的,我有一个受密码保护的网站克隆,可以使用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]标志时,为什么在验证之前没有完成重定向?

1 个答案:

答案 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>