htaccess 从 Basic Auth 中排除一个 url

Posted

技术标签:

【中文标题】htaccess 从 Basic Auth 中排除一个 url【英文标题】:htaccess exclude one url from Basic Auth 【发布时间】:2012-02-17 04:23:36 【问题描述】:

我需要从正常的 htaccess 基本身份验证保护中排除一个 Url(甚至更好的一个前缀)。类似/callbacks/myBank/callbacks/.* 你有什么提示吗?

我不想要的是如何排除文件。 这必须是 url(因为这是基于 php 框架的解决方案,并且所有 url 都使用mod_rewrite 重定向到index.php)。所以这个网址下没有文件。什么都没有。

其中一些 url 只是来自其他服务的回调(不知道 IP,所以我不能根据 IP 排除),它们无法提示输入用户/密码。

目前的定义很简单:

AuthName "Please login."
AuthGroupFile /dev/null
AuthType Basic
AuthUserFile /xxx/.htpasswd
require valid-user 

【问题讨论】:

【参考方案1】:

使用SetEnvIf,您可以在请求以某个路径开始时创建一个变量,然后使用Satisfy Any 指令来避免登录。

# set an environtment variable "noauth" if the request starts with "/callbacks/"
SetEnvIf Request_URI ^/callbacks/ noauth=1

# the auth block
AuthName "Please login."
AuthGroupFile /dev/null
AuthType Basic
AuthUserFile /xxx/.htpasswd

# Here is where we allow/deny
Order Deny,Allow
Satisfy any
Deny from all
Require valid-user
Allow from env=noauth

allow/deny 指令块表示拒绝 EVERYONE 的访问,除非存在 valid-user(成功的 BASIC auth 登录)或 @987654325 @变量已设置。

【讨论】:

我在 DocumentRoot /var/www/Symfony/web/ 中添加了此部分,但它不起作用。 您能否解释一下,为什么 在这里不起作用? 谢谢!真的帮了我,小心案例 - 我有Order deny,allow,但它不起作用。不用说非常令人沮丧! 可能需要Allow from env=REDIRECT_noauth 用于重写网址。可能是@vishal 的问题。看看这里:[***.com/a/41092497/1285585] 我需要 两行Allow from env=noauthAllow from env=REDIRECT_noauth 才能工作。【参考方案2】:

如果您使用的是 Apache 2.4,则不再需要 SetEnvIf 和 mod_rewrite 变通办法,因为 Require 指令能够直接解释表达式:

AuthType Basic
AuthName "Please login."
AuthUserFile "/xxx/.htpasswd"

Require expr %REQUEST_URI =~ m#^/callbacks/.*#
Require valid-user

Apache 2.4 将 not<RequireAll> 分组的Require 指令视为它们位于<RequireAny> 中,其行为类似于“或”语句。下面是一个更复杂的示例,它演示了将请求 URI 和查询字符串匹配在一起,并回退到要求有效用户:

AuthType Basic
AuthName "Please login."
AuthUserFile "/xxx/.htpasswd"

<RequireAny>
    <RequireAll>
        # I'm using the alternate matching form here so I don't have
        # to escape the /'s in the URL.
        Require expr %REQUEST_URI =~ m#^/callbacks/.*#

        # You can also match on the query string, which is more
        # convenient than SetEnvIf.
        #Require expr %QUERY_STRING = 'secret_var=42'
    </RequireAll>

    Require valid-user
</RequireAny>

此示例将允许访问 /callbacks/foo?secret_var=42,但需要 /callbacks/foo 的用户名和密码。

请记住,除非您使用 &lt;RequireAll&gt;,否则 Apache 将尝试按顺序匹配每个 Require,因此请考虑您首先要允许哪些条件。

Require 指令的参考在这里:https://httpd.apache.org/docs/2.4/mod/mod_authz_core.html#require

expression 参考在这里:https://httpd.apache.org/docs/2.4/expr.html

【讨论】:

我必须删除 Require expr 周围的双引号,它才能在 apache 2.4.7 上工作。除此之外效果很好。 我也不得不删除双引号,但效果很好。 不适用于我的 Apache 2.4.10 / cakephp 3 安装。我想排除 /rest,这是一个虚拟路径(重写规则)。不知道为什么它不起作用。 @stephan-richter 我怀疑是因为 %REQUEST_URI 值是重写的字符串。对于 Cake 3,最终几乎总是/webroot/index.php。您可能必须想出一种替代方法,例如使用 Cake 本身来处理路由的身份验证。 你是对的。在这个问题上发了一个问题,自己找到了答案:***.com/questions/41077895/…【参考方案3】:

这个方案效果很好,你只需要定义你想要通过的白名单。

SetEnvIfNoCase Request_URI "^/status\.php" noauth

AuthType Basic
AuthName "Identify yourself"
AuthUserFile /path/to/.htpasswd
Require valid-user

Order Deny,Allow
Deny from all
Allow from env=noauth

Satisfy any

【讨论】:

【参考方案4】:

我尝试了其他解决方案,但这对我有用。希望对其他人有所帮助。

# Auth stuff
AuthName "Authorized personnel only."
AuthType Basic
AuthUserFile /path/to/your/htpasswd/file

SetEnvIf Request_URI "^/index.php/api/*" allow
Order allow,deny
Require valid-user
Allow from env=allow
Deny from env=!allow
Satisfy any

这将允许 api url 和 /index.php/api/ 之后的任何 url 字符串无需登录即可打开,并且将提示登录其他任何内容。

例子:

mywebsite.com/index.php/api 将打开而不提示登录 mywebsite.com/index.php/api/soap/?wsdl=1 将打开而不提示登录 mywebsite.com会提示先登录

【讨论】:

最好的解决方案,所有其他的都不起作用。谢谢提供!!!【参考方案5】:
<location />
        SetEnvIf Request_URI "/callback/.*" REDIRECT_noauth=1

        AuthType Basic
        AuthName "Restricted Files"
        AuthUserFile /etc/httpd/passwords/passwords
        Order Deny,Allow
        Satisfy any
        Deny from all
        Allow from env=REDIRECT_noauth
        Require user yournickname
</location>

【讨论】:

【参考方案6】:

如果您要保护的区域有一个控制一切的单一 PHP 脚本,例如 Wordpress,则另一种方法是这样工作的。在不同的目录中设置身份验证。将 index.php 放在那里,在路径“/”上设置一个 cookie。然后在 Wordpress(例如)中检查 cookie,但绕过检查 $_SERVER['REQUEST_URI'] 是否是排除的 URL。

在我的共享主机平台上,RewriteRule 无法设置与“满足任何条件”一起使用的环境变量。

使用任何方法,请注意您要保护的页面不包含图像、样式表等,当页面本身没有触发身份验证请求时。

【讨论】:

【参考方案7】:

将以下代码添加到您的根 htaccess 文件中,不要忘记更改您的管理 url,.htpasswd 文件页面。

<Files "admin.php">
        AuthName "Cron auth"
        AuthUserFile E:\wamp\www\mg\.htpasswd
        AuthType basic
        Require valid-user
    </Files>

在您的根文件夹中创建 .htpasswd 文件并在下面添加用户名和密码(设置默认用户名:admin 和密码:admin123)

admin:$apr1$8.nTvE4f$UirPOK.PQqqfghwANLY47.

如果您仍然遇到任何问题,请告诉我。

【讨论】:

【参考方案8】:

您为什么不按照预期的方式使用基本身份验证?

user:password@domain.com/callbacks/etc

【讨论】:

好吧,因为 a) 没有人真正想要 URI 字符串中的™ auth 数据,b) 因为 OP 可能没有机会自定义调用(因为他正在谈论来自银行的回调,我认为他无法改变客户端的行为)

以上是关于htaccess 从 Basic Auth 中排除一个 url的主要内容,如果未能解决你的问题,请参考以下文章

.htaccess & WordPress:从 RewriteRule 中排除文件夹

如何从 .htaccess 中排除子文件夹

从 .htaccess 中的密码保护中排除一个文件

从htaccess重写中排除文件夹

从htaccess密码保护中排除特定的laravel路由

从 HTACCESS 文件中的所有 ISAPI 重写 3 规则中排除目录