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)或者设置了noauth
variables以外,拒绝每个人的访问。
这个解决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