apache:重写前的基本身份验证

pyr*_*yro 9 apache mod-rewrite basic-authentication

我在前端有一个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>
Run Code Online (Sandbox Code Playgroud)

但是不起作用.

有什么建议?

Tra*_*son 10

通常,Apache在授权阶段之前执行重写阶段,这就是为什么您的代码执行重写而不要求用户进行身份验证的原因.

你可以用LA-U:REMOTE_USER变量解决这个问题.在RewriteRule前面加上一个向前看("LA")到授权阶段的条件:

RewriteCond %{LA-U:REMOTE_USER} !^$
RewriteRule ^/(.*) http://xxxxxx:xxx/$1 [L]
Run Code Online (Sandbox Code Playgroud)

请参阅http://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewritecond中的相关说明

正如其他海报所指出的那样,将RewriteRule指令从块中取出也更好,因此它们更可靠.


pyr*_*yro 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]
Run Code Online (Sandbox Code Playgroud)

非常感谢h0tw1r3的建议

*请记住,Location指令对URL而不是目录进行操作.这意味着如果有人为文档根创建别名,他们将完全绕过这些身份验证规则.(有关更多信息,请参阅http://httpd.apache.org/docs/2.0/mod/core.html#location.)