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

时间:2010-04-09 09:53:41

标签: 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>

但是不起作用。

有什么建议吗?

4 个答案:

答案 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做任何事情:

  1. 您需要在<Directory>容器(目录上下文)内启用重写引擎 。您(错误地)在外部<VirtualHost>容器( virtualhost 上下文)中启用了重写引擎-在该容器中没有任何mod_rewrite指令。 <VirtualHost><Directory>容器在不同的上下文中工作。如果您没有在<Directory>容器中启用重写引擎,那么这些指令将被忽略。

    RewriteEngine On
    
  2. 目录上下文(<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)。