htaccess 从 Basic Auth 中排除一个 url
Posted
技术标签:
【中文标题】htaccess 从 Basic Auth 中排除一个 url【英文标题】:htaccess exclude one url from Basic Auth 【发布时间】:2012-02-17 04:23:36 【问题描述】:我需要从正常的 htaccess 基本身份验证保护中排除一个 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
【问题讨论】:
【参考方案1】:使用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 的访问,除非存在 valid-user(成功的 BASIC auth 登录)或 @987654325 @变量已设置。
【讨论】:
我在Order deny,allow
,但它不起作用。不用说非常令人沮丧!
可能需要Allow from env=REDIRECT_noauth
用于重写网址。可能是@vishal 的问题。看看这里:[***.com/a/41092497/1285585]
我需要 两行 行 Allow from env=noauth
和 Allow from env=REDIRECT_noauth
才能工作。【参考方案2】:
如果您使用的是 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 将 not 由<RequireAll>
分组的Require
指令视为它们位于<RequireAny>
中,其行为类似于“或”语句。下面是一个更复杂的示例,它演示了将请求 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
ession 参考在这里:https://httpd.apache.org/docs/2.4/expr.html
【讨论】:
我必须删除 Require expr 周围的双引号,它才能在 apache 2.4.7 上工作。除此之外效果很好。 我也不得不删除双引号,但效果很好。 不适用于我的 Apache 2.4.10 / cakephp 3 安装。我想排除 /rest,这是一个虚拟路径(重写规则)。不知道为什么它不起作用。 @stephan-richter 我怀疑是因为%REQUEST_URI
值是重写的字符串。对于 Cake 3,最终几乎总是/webroot/index.php
。您可能必须想出一种替代方法,例如使用 Cake 本身来处理路由的身份验证。
你是对的。在这个问题上发了一个问题,自己找到了答案:***.com/questions/41077895/…【参考方案3】:
这个方案效果很好,你只需要定义你想要通过的白名单。
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 url 和 /index.php/api/
之后的任何 url 字符串无需登录即可打开,并且将提示登录其他任何内容。
例子:
mywebsite.com/index.php/api
将打开而不提示登录
mywebsite.com/index.php/api/soap/?wsdl=1
将打开而不提示登录
mywebsite.com
会提示先登录
【讨论】:
最好的解决方案,所有其他的都不起作用。谢谢提供!!!【参考方案5】:<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>
【讨论】:
【参考方案6】:如果您要保护的区域有一个控制一切的单一 PHP 脚本,例如 Wordpress,则另一种方法是这样工作的。在不同的目录中设置身份验证。将 index.php 放在那里,在路径“/”上设置一个 cookie。然后在 Wordpress(例如)中检查 cookie,但绕过检查 $_SERVER['REQUEST_URI'] 是否是排除的 URL。
在我的共享主机平台上,RewriteRule 无法设置与“满足任何条件”一起使用的环境变量。
使用任何方法,请注意您要保护的页面不包含图像、样式表等,当页面本身没有触发身份验证请求时。
【讨论】:
【参考方案7】:将以下代码添加到您的根 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.
如果您仍然遇到任何问题,请告诉我。
【讨论】:
【参考方案8】:您为什么不按照预期的方式使用基本身份验证?
user:password@domain.com/callbacks/etc
【讨论】:
好吧,因为 a) 没有人真正想要 URI 字符串中的™ auth 数据,b) 因为 OP 可能没有机会自定义调用(因为他正在谈论来自银行的回调,我认为他无法改变客户端的行为)以上是关于htaccess 从 Basic Auth 中排除一个 url的主要内容,如果未能解决你的问题,请参考以下文章