我需要从正常的htaccess Basic Auth保护中排除一个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
答案 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