htaccess从基本身份验证中排除一个网址


79

我需要从普通的htaccess基本身份验证保护中排除一个网址(或更好的一个前缀)。像/callbacks/myBank还是/callbacks/.* ,您有任何提示如何做吗?

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

其中一些url只是来自其他服务的回调(未知IP,因此我无法基于IP排除),并且它们无法提示输入用户名/密码。

当前定义很简单:

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

Answers:


59

如果您使用的是Apache 2.4,SetEnvIf则由于该Require指令能够直接解释表达式,因此不再需要mod_rewrite解决方法:

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

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

Apache 2.4对待未按其分组的Require指令,就像它们在一样,其行为类似于“或”语句。这是一个更复杂的示例,该示例演示了将请求URI和查询字符串都匹配到一起,并回退到需要有效用户的情况:<RequireAll><RequireAny>

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


3
我必须删除Require expr周围的双引号,以使其在apache 2.4.7上工作。除此之外,它工作得很好。
斯科特·史密斯史密斯

我也不得不删除双引号,但效果很好。
TMPilot

1
在我的Apache 2.4.10 / cakephp 3安装上不起作用。我想排除/ rest,这是一个虚拟路径(重写规则)。不知道为什么它不起作用。
斯蒂芬·里希特

3
我怀疑@ stephan-richter,因为该%{REQUEST_URI}值是重写的字符串。对于Cake 3,几乎总是存在/webroot/index.php。您可能需要提出一种替代方法,例如使用Cake本身来处理路由的身份验证。
beporter

你是对的。发布一个问题,关于这个问题,并找到自己的答案:stackoverflow.com/questions/41077895/...
斯蒂芬·里克特

85

使用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的访问,除非有有效用户(成功的BASIC auth登录)或noauth设置了变量。


我在<VirtualHost *:80> DocumentRoot / var / www / Symfony / web / <Directory / var / www // Symfony / web>中添加了此部分,但它不起作用。
2014年

您能否解释一下为什么<Files>在这里不起作用?
2015年

1
谢谢!确实帮了我大忙,要小心点-我有Order deny,allow,它不起作用。不用说很令人沮丧!
James F

2
可能需要一个Allow from env=REDIRECT_noauth用于重写的网址。@vishal可能是问题所在。在这里看看:[ stackoverflow.com/a/41092497/1285585]
Stephan Richter

2
我需要线Allow from env=noauthAllow from env=REDIRECT_noauth为它工作。
CDuv

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

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网址和之后的所有网址字符串 /index.php/api/,而无需登录,然后会提示其他任何内容。

例:

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


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>

0

如果您要保护的区域具有用于控制所有内容的整体PHP脚本(如Wordpress),则可以采用这种方法。在其他目录中设置身份验证。将index.php放置在路径“ /”上设置cookie。然后在Wordpress中(例如),检查cookie,但是绕过检查$ _SERVER ['REQUEST_URI']是否为排除的URL。

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

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


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.

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


0

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

user:password@domain.com/callbacks/etc

1
好吧,因为a)没人真正想要URI字符串中的auth数据,并且b)因为OP可能没有机会自定义呼叫(因为他正在谈论银行的回叫,所以我认为他无法更改行为)
frank42 '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.