9

我在前端有一个 Apache,它应该通过RewriteRule.

我必须在重定向请求之前进行基本身份验证,所以我将它放在配置文件中:

<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>

但它不起作用。

有什么建议么?

更新:我希望身份验证后的所有请求都将使用规则重定向,RewriteRule ^/(.*) xxxxxx:xxx/$1 [P,L]但这不会发生。Apache搜索下的页面/var/www/html

4

4 回答 4

11

通常,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 指令从块中取出,这样它们就更可靠了。

于 2012-11-08T18:05:17.560 回答
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 的建议

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

于 2010-04-12T09:12:11.223 回答
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>
于 2010-04-11T05:45:57.483 回答
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>容器(虚拟主机上下文)中启用了重写引擎 - 在其中您没有任何 mod_rewrite 指令。<VirtualHost><Directory>容器在不同的上下文工作。如果您没有在<Directory>容器内启用重写引擎,那么这些指令将被忽略。

    RewriteEngine On
    
  2. 目录上下文 ( <Directory>and ) 中使用时,模式.htaccess匹配的 URL 路径不以斜杠开头,因为目录前缀(以斜杠结尾)已被删除。因此,您需要从正则表达式中删除斜杠前缀,否则,它将永远不会在目录上下文中匹配:RewriteRule

    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>并直接在<VirtualHost>已启用重写引擎的容器内使用它。

However, in this context, the mod_rewrite directives will execute before the authorisation directives inside the <Directory> container, so you will need the additional condition that checks the REMOTE_USER via a look-ahead (ie. LA-U:REMOTE_USER), as mentioned in the other answers.

于 2020-07-15T12:25:49.347 回答