我在前端有一个apache,通过重写规则重定向请求。 我必须在重定向请求之前进行基本身份验证,因此我将其放在配置文件中:
<VirtualHost *:443>
ServerAdmin xxxxxx
DocumentRoot /var/www/html/
ServerName xxxxxxx
RewriteEngine on
ErrorLog logs/error.log
CustomLog logs/access_log common
<Directory /var/www/html/>
AuthType Basic
AuthName "Restricted Files"
AuthUserFile /etc/httpd/conf/tag.pwd
Require valid-user
RewriteRule ^/(.*) http://xxxxxx:xxx/$1 [P,L]
</Directory>
</VirtualHost>
但是不起作用。
有什么建议吗?
答案 0 :(得分:10)
通常,Apache在授权阶段之前执行重写阶段,这就是为什么您的代码执行重写而不要求用户进行身份验证的原因。
您可以使用LA-U:REMOTE_USER
变量解决此问题。在RewriteRule前面加上一个向前看(“LA”)到授权阶段的条件:
RewriteCond %{LA-U:REMOTE_USER} !^$
RewriteRule ^/(.*) http://xxxxxx:xxx/$1 [L]
请参阅http://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewritecond
中的相关说明正如其他海报所指出的那样,最好将RewriteRule指令从块中取出,以便它们更可靠。
答案 1 :(得分:5)
我解决了将重写条件和重写规则放在Locatio指令之外的问题:
<Location />
AuthType Basic
AuthName "Restricted Files"
AuthUserFile /etc/httpd/conf/tag.pwd
Require valid-user
</Location>
RewriteCond %{LA-U:REMOTE_USER} !^$
RewriteRule ^/(.*) http://xxxxxx:xxx/$1 [P,L]
非常感谢h0tw1r3的建议
*请记住,Location指令对URL而不是目录进行操作。这意味着如果有人为文档根创建别名,他们将完全绕过这些身份验证规则。 (有关详情,请参阅http://httpd.apache.org/docs/2.0/mod/core.html#location。)
答案 2 :(得分:2)
更新:隐式目录规则确保在重写完成之前始终需要验证。发现apache模块的不同组合改变了行为,因此接受的答案可能并不总是有效。
<Location />
AuthType Basic
AuthName "Restricted Files"
AuthUserFile /etc/httpd/conf/tag.pwd
Require valid-user
</Location>
<Directory /documentroot>
RewriteCond %{LA-U:REMOTE_USER} (.+)
RewriteRule (.*) http://xxxxxx:xxx/$1 [P,L]
</Directory>
答案 3 :(得分:0)
<Directory /var/www/html/> AuthType Basic AuthName "Restricted Files" AuthUserFile /etc/httpd/conf/tag.pwd Require valid-user RewriteRule ^/(.*) http://xxxxxx:xxx/$1 [P,L] </Directory>
这里有两个问题会阻止您的RewriteRule
做任何事情:
您需要在<Directory>
容器(目录上下文)内启用重写引擎 。您(错误地)在外部<VirtualHost>
容器( virtualhost 上下文)中启用了重写引擎-在该容器中没有任何mod_rewrite指令。 <VirtualHost>
和<Directory>
容器在不同的上下文中工作。如果您没有在<Directory>
容器中启用重写引擎,那么这些指令将被忽略。
RewriteEngine On
在目录上下文(<Directory>
和.htaccess
)中使用时,RewriteRule
模式匹配的URL路径不能以斜杠开头,因为目录前缀(以斜杠结尾)已被删除。因此,您需要从正则表达式中删除斜杠前缀,否则,它将在 directory 上下文中根本不匹配:
RewriteRule (.*) http://xxxxxx:xxx/$1 [P,L]
(模式上的^
前缀变得多余了。)
按照以上几点进行操作,将变为:
<Directory /var/www/html/>
AuthType Basic
AuthName "Restricted Files"
AuthUserFile /etc/httpd/conf/tag.pwd
Require valid-user
RewriteEngine On
RewriteRule (.*) http://xxxxxx:xxx/$1 [P,L]
</Directory>
或者,您将RewriteRule
指令移到<Directory>
容器之外,并在已经启用了{重写引擎。
但是,在这种情况下,mod_rewrite指令将在<VirtualHost>
容器内的授权指令之前执行 ,因此您将需要通过以下条件检查<Directory>
的附加条件:如其他答案中所提到的那样,是前瞻性的(例如REMOTE_USER
)。