htaccess从基本authentication中排除一个URL

我需要从正常的htaccess基本身份validation保护中排除一个Url(或更好的一个前缀)。 就像/ callbacks / myBank/ callbacks /。 *你有什么提示怎么做?

我不在寻找的是如何排除文件。 这必须是url(因为这是基于PHP框架的解决scheme,并且所有的URL都通过mod_rewriteredirect到index.php)。 所以这个url下没有文件。 没有。

其中一些URL只是来自其他服务的callback(没有IP不知道,所以我不能根据IP排除),他们不能提示用户/密码。

目前的定义如下简单:

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

如果您使用的是Apache 2.4,则SetEnvIf和mod_rewrite解决方法不再是必需的,因为Require指令能够直接解释expression式:

 AuthType Basic AuthName "Please login." AuthUserFile "/xxx/.htpasswd" Require expr %{REQUEST_URI} =~ m#^/callbacks/.*# Require valid-user 

Apache 2.4将Require指令视为不是<RequireAll>分组,就像它们在<RequireAny> ,其行为与“或”语句相同。 下面是一个更复杂的例子,它演示了如何将请求URI和查询string进行匹配,然后再回到需要一个有效的用户:

 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

表示引用在这里: https ://httpd.apache.org/docs/2.4/expr.html

使用SetEnvIf ,可以在请求以某个path开始时创build一个variables,然后使用Satisfy Any指令避免login。

 # 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 

允许/拒绝指令块说除了存在有效用户 (成功的BASICauthenticationlogin)或者设置了noauthvariables以外,拒绝每个人的访问。

这个解决scheme工作得很好,你只需要定义你想要通过的白名单。

 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 

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

在我的共享主机平台上,RewriteRule无法设置与“满足任何”一起工作的环境variables。

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

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

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

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

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

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

请让我知道,如果你仍然面临任何问题。

我尝试了其他的解决scheme,但是这对我来说是有效的。 希望这会对其他人有所帮助。

 # 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 

这将允许打开/index.php/api/后的api URL和任何urlstring,而不必login,其他任何东西都会被提示login。

例:

mywebsite.com/index.php/api将会打开,而不会被提示loginmywebsite.com/index.php/api/soap/?wsdl=1会打开而不会提示loginmywebsite.com将会提示您先login

你为什么不使用基本的authentication方式呢?

 user:password@domain.com/callbacks/etc