Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache 为什么不是';当使用L标志时,是否在身份验证之前执行重定向?_Apache_.htaccess_Authentication_Redirect_Mod Rewrite - Fatal编程技术网

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。对我有用,谢谢。