Apache 为什么不是';当使用L标志时,是否在身份验证之前执行重定向?
出于测试目的,我有一个受密码保护的网站克隆,可以使用子域(如Apache 为什么不是';当使用L标志时,是否在身份验证之前执行重定向?,apache,.htaccess,authentication,redirect,mod-rewrite,Apache,.htaccess,Authentication,Redirect,Mod Rewrite,出于测试目的,我有一个受密码保护的网站克隆,可以使用子域(如dev.example.com)访问。我使用的是基本身份验证,所有流量都应该使用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
)访问。我使用的是基本身份验证
,所有流量都应该使用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
时的情况
其想法是,应该在身份验证之前进行重定向,但情况似乎并非如此。访问http://dev.example.com
,将弹出身份验证。如果我输入的凭据正确,我将被重定向到https://dev.example.com
,身份验证再次弹出
我发现类似的情况,没有使用
[L]
标志。建议的解决方案是在使用https
时设置环境变量,并且仅在设置该变量时才允许访问。但是我不明白为什么我不能只用[L]
标志来代替。也许我误解了它的用途和意义。当使用[L]
标志时,为什么不在身份验证之前执行重定向?似乎不同的Apache模块独立工作,而[L]
标志并不阻止身份验证的发生,尽管文档中说使用此标志表示应立即应用当前规则,而不考虑其他规则。
最后,我将身份验证包装在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>
#需要身份验证
#如果连接不安全,身份验证将被推迟
AuthName“受限开发环境”
AuthType Basic
AuthUserFile/var/www/html/.htpasswd
需要有效用户
看来不同的Apache模块是独立工作的,[L]
标志并不能阻止身份验证的发生,尽管文档中说使用此标志表示应立即应用当前规则,而不考虑其他规则。
最后,我将身份验证包装在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>
#需要身份验证
#如果连接不安全,身份验证将被推迟
AuthName“受限开发环境”
AuthType Basic
AuthUserFile/var/www/html/.htpasswd
需要有效用户
您误解了L
标志L
标志在循环中的作用类似于continue
。它只是强制mod_rewrite
循环再次运行。此外,身份验证是使用完全独立于L
标志的mod\u auth\u basic
完成的。谢谢,@anubhava。在文档中:“使用此标志指示应立即应用当前规则,而不考虑其他规则。”对我来说,这听起来像是当[L,R=302]
-规则匹配时,应立即执行302重定向,并且只有在重定向之后才能到达auth部分?auth部分来自不同的模块,因此L
标志或任何mod_rewrite
标志都不会阻止它执行。也可能在mod_rewrite
模块之前首先执行auth部分。这些模块之间通信的唯一方式是使用allow from
或deny from
指令中的env变量。您误解了L
标志L
标志在循环中的作用类似于continue
。它只是强制mod_rewrite
循环再次运行。此外,身份验证是使用完全独立于L
标志的mod\u auth\u basic
完成的。谢谢,@anubhava。在文档中:“使用此标志指示应立即应用当前规则,而不考虑其他规则。”对我来说,这听起来像是当[L,R=302]
-规则匹配时,应立即执行302重定向,并且只有在重定向之后才能到达auth部分?auth部分来自不同的模块,因此L
标志或任何mod_rewrite
标志都不会阻止它执行。也可能是在mod_rewrite
模块之前首先执行auth部分。这些模块之间通信的唯一方式是使用allow from
或deny from
指令中的env变量。将我的htpasswd代码包装在这个条件中会给我带来一个错误500。对我来说是有效的,谢谢。在这个条件中包装我的htpasswd代码会为我抛出一个错误500。对我有用,谢谢。