Htaccess 从基本认证中排除一个 URL

我需要从普通的 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
96618 次浏览

使用 赛特恩弗,您可以在请求以某个路径开始时创建一个变量,然后使用 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

允许/拒绝指令块表示拒绝对 所有人的访问,除非有一个 有效用户(成功的 BASIC auth 登录)或者设置了 noauth变量。

这个解决方案工作得很好,你只需要定义你想要传递的白名单。

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。在其他目录中设置身份验证。在那里放一个 index.php,它在路径“/”上设置 cookie。然后在 Wordpress (例如)中,检查 cookie,但是如果 $_ SERVER [‘ REQUEST _ URI’]是被排除的 URL,则跳过检查。

在我的共享托管平台上,重写规则无法设置一个可以“满足任何”的环境变量。

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

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

如果您正在使用 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将 没有<RequireAll>分组的 Require指令视为 <RequireAny><RequireAny>的行为类似于“ or”语句。下面是一个更复杂的示例,演示了如何将请求 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

expression 参考文献在这里: https://httpd.apache.org/docs/2.4/expr.html

将下面的代码添加到您的根 htaccess 文件,不要忘记更改您的管理网址,. 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.

如果你还有什么问题,请告诉我。

我尝试了其他的解决方案,但这对我很有效,希望对其他人有所帮助。

# 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 和任何 url 字符串,而无需登录,并且将提示其他任何内容登录。

例如:

mywebsite.com/index.php/api将在不提示登录的情况下打开 mywebsite.com/index.php/api/soap/?wsdl=1将在不提示登录的情况下打开 将提示 mywebsite.com先登录

为什么不按照原来的方式使用基本认证呢?

user:password@domain.com/callbacks/etc