.htaccess htaccess从基本身份验证中排除一个URL

fzwojiic  于 2022-12-13  发布在  其他
关注(0)|答案(9)|浏览(155)

我需要从普通的htaccess基本认证保护中排除一个URL(或者更好的是一个前缀)。比如/callbacks/myBank/callbacks/.*你有什么提示吗?
我不想知道如何排除一个文件。这必须是url(因为这是基于PHP框架的解决方案,所有的url都被mod_rewrite重定向到index.php)。所以这个URL下没有文件。什么都没有。
其中一些URL只是来自其他服务的回调(没有IP是未知的,所以我不能根据IP排除),他们不能提示用户/密码。
电流定义简单如:

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

dy2hfwbg1#

使用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身份验证登录)或设置了noauth变量。

0dxa2lsx

0dxa2lsx2#

如果您使用的是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>,这相当于一个“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
expr会话参考如下:https://httpd.apache.org/docs/2.4/expr.html

kiayqfof

kiayqfof3#

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

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

8gsdolmq4#

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

# 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将提示先登录

gywdnpxw

gywdnpxw5#

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

rvpgvaaj6#

另一种方法是这样的,如果你要保护的区域有一个单一的PHP脚本来控制一切,比如Wordpress。在另一个目录中设置Authentication with。在那里放置一个index.php,在路径'/'上设置一个cookie。然后在Wordpress中(例如),检查cookie,但是如果$_SERVER ['REQUEST_URI']是被排除的URL,则跳过检查。
在我的共享主机平台上,RewriteRule无法设置与“Satisfy any”一起工作的环境变量。
使用任何方法时,都要注意您所保护的页面不包含图像、样式表等,这些内容会在页面本身不包含时触发身份验证请求。

0pizxfdo

0pizxfdo7#

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

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

在根文件夹中创建.htpasswd文件,并在下面添加用户名和密码(设置默认用户名:admin和密码:管理员123)

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

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

ojsjcaue

ojsjcaue8#

为什么不直接使用基本的身份验证呢?

user:password@domain.com/callbacks/etc
c2e8gylq

c2e8gylq9#

这些都不适用于我的Apache 2.4,因为我的PHP/Laravel htaccess做了一个重写,并将Request_URI更改为总是/index.php
我使用Require expr %{THE_REQUEST}来获取HTTP请求(THE_REQUEST)的第一行,它保持不变。
例如,“GET /回调HTTP/1.1”
这对我很有效:

<Location />
        AuthType Basic
        AuthName "Restricted Content"
        AuthUserFile /etc/apache2/.htpasswd
        Require expr %{THE_REQUEST} =~ m#^GET /callbacks#
        Require valid-user
    </Location>

请注意,如果需要或允许两者,则需要将GET更改为POST:

Require expr %{THE_REQUEST} =~ m#^GET /callbacks#
        Require expr %{THE_REQUEST} =~ m#^POST /callbacks#
        Require valid-user

有关需要表达式的详细信息

相关问题