htaccess从Basic Auth中排除一个URL

时间:2012-01-23 20:26:27

标签: apache .htaccess authorization

我需要从正常的htaccess Basic Auth保护中排除一个Url(甚至更好的一个前缀)。像/callbacks/myBank/callbacks/.*之类的东西 你有什么提示怎么做吗?

我不想要的是如何排除文件。 这必须是url(因为这是基于PHP框架的解决方案,并且所有URL都被重定向到mod_rewriteindex.php)。所以此URL下没有文件。什么都没有。

其中一些网址只是来自其他服务的回调(没有IP是未知的,所以我不能基于IP排除),他们无法提示用户/密码。

目前的定义很简单:

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

8 个答案:

答案 0 :(得分:79)

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

允许/拒绝指令块表示拒绝访问 EVERYONE ,除非有有效用户(成功的BASIC auth登录)或{{ 1}}变量已设置。

答案 1 :(得分:45)

如果您使用的是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将分组的Require指令视为<RequireAll>,就好像它们位于<RequireAny>中一样,表现为&#34;或& #34;声明。这是一个更复杂的示例,它演示了将请求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的用户名和密码。

请注意,除非您使用<RequireAll>,否则Apache会尝试按顺序匹配每个Require ,因此请先考虑您要允许的条件。

Require指令的引用位于:https://httpd.apache.org/docs/2.4/mod/mod_authz_core.html#require

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

答案 2 :(得分:6)

此解决方案非常有效,您只需要定义要通过的白名单。

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

# 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 :(得分:0)

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

在我的共享托管平台上,RewriteRule无法设置使用“满足任何”的环境变量。

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

答案 6 :(得分:0)

将以下代码添加到根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.

如果您仍然遇到任何问题,请与我们联系。

答案 7 :(得分:-1)

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

user:password@domain.com/callbacks/etc