【问题标题】:apache: basic authentication before rewriteapache:重写前的基本身份验证
【发布时间】:2010-04-09 09:53:40
【问题描述】:

我在前端有一个 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下的页面

【问题讨论】:

  • 您预计会发生什么?究竟发生了什么?你做了什么来实现它?你还尝试了什么?
  • 我希望身份验证后的所有请求都将使用规则 RewriteRule ^/(.*) xxxxxx:xxx/$1 [P,L] 重定向,但这不会发生 Apache 在 /var 下搜索页面/www/html

标签: apache mod-rewrite basic-authentication


【解决方案1】:

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

【讨论】:

  • 这回答了一个与问题中所述的不同的问题。 “您的代码在不要求用户进行身份验证的情况下执行重写” - 这不是问题中所说的。 OP 声明 RewriteRule 根本没有被处理 - 用户 is 提示进行身份验证。 OP 中的代码在 &lt;Directory&gt; 容器内缺少 RewriteEngine On 指令,并且正则表达式不正确(directory 上下文中不应有斜杠前缀) - 这两个问题都会阻止mod_rewrite 指令做任何事情。见stackoverflow.com/a/62914796/369434
【解决方案2】:

我解决了将重写条件和重写规则放在 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。)

【讨论】:

  • "绕过这些身份验证规则" - 尽管如文档中所述,单斜杠 (/) 是一种“特殊情况”,因为它适用于每个 URL - 所以在这方面它不能被“绕过”。 (当然,如果别名是从完全不同的 VirtualHost 创建的,那么它将被绕过 - 但在这种情况下,整个 VirtualHost 都会被绕过,而不仅仅是 Location 块。)
【解决方案3】:

更新:隐式目录规则确保在重写完成之前始终需要验证。发现 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>

【讨论】:

  • mmm 不行 :(.apache 继续在本地搜索页面
  • 最近又出现了这个问题,即使 pyro 接受的答案在 Apache 2.2.22 (Ubuntu) 上也对我不起作用。
  • 您需要在&lt;Directory&gt; 容器内部 启用重写引擎(即RewriteEngine On),否则mod_rewrite 指令将被忽略。 (这是 OP 中的一个问题。)请参阅下面的my answer
【解决方案4】:
<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>

这里有 2 个问题会阻止您的 RewriteRule 做任何事情:

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

    RewriteEngine On
    
  2. 目录上下文(&lt;Directory&gt;.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 指令移到 &lt;Directory&gt; 容器之外,并直接在您已启用重写引擎的 &lt;VirtualHost&gt; 容器中使用它。

但是,在这种情况下,mod_rewrite 指令将在&lt;Directory&gt; 容器内执行之前授权指令,因此您需要通过前瞻检查REMOTE_USER 的附加条件(即LA-U:REMOTE_USER),如其他答案中所述。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-25
    • 1970-01-01
    • 2011-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-05
    • 2016-02-08
    相关资源
    最近更新 更多