htaccess 默认拒绝父路径,允许单个正则表达式虚拟子路径

htaccess 默认拒绝父路径,允许单个正则表达式虚拟子路径

我想默认拒绝所有匿名用户,但允许匿名用户使用特定的虚拟路径;虚拟路径是由 wordpress htaccess + php 创建的

当前设置

AuthUserFile /var/www/domains/dev/.htpasswd
AuthType Basic
AuthName "Password Required"
Require user jackson dawna
Order Deny,Allow
Deny from All

<If "%{REQUEST_URI} =~ m#/sites/dawna/wordpress/wp-json/wp/v2/.*#">
        Order Allow,Deny
        Allow from All
        Satisfy Any
</If>

Satisfy Any

问题

上述代码拒绝所有用户并要求输入凭证。但是,如果我将全局切换到Allow from All并将If切换到,Deny from All则此操作将按预期工作,仅拒绝指定的路由

问题

我如何允许匿名访问者访问我的虚拟路线,同时对其他所有内容进行密码保护?

答案1

从表面上看,你只需要在请求的 URL 路径为不是您希望允许公开访问的 URL 路径。否则,只需允许访问即可。

您还在看似 Apache 2.4 的系统上混合使用了 Apache 2.2 身份验证指令。

请尝试以下类似操作:

<If "%{REQUEST_URI} !~ m#^/this/urlpath/is/public/#">
    AuthUserFile /var/www/domains/dev/.htpasswd
    AuthType Basic
    AuthName "Password Required"
    Require user jackson dawna
</If>

上述代码检查请求的 URL 是否未开始/this/urlpath/is/public/(您的示例中缺少字符串起始锚点^),并且只有在 URL 未开始的情况下才会提示进行身份验证。然后默认操作是允许访问(对于以该 URL 路径开头的任何 URL)。

答案2

由于虚拟路径(由 wordpress 创建)的性质,我不得不使用THE_REQUEST

<If "%{THE_REQUEST} =~ m#^GET /sites/dawna/wordpress/wp-json/#">
        Allow from All
        Satisfy Any
</If>

wordpress 重定向使用,wordpress/index.php因此使用REQUEST_URI不起作用,因为 uri 总是/path/to/wordpress/index.php使我的 if 语句无用。

笔记

如果您需要支持 PUT 或其他,您必须添加它。[A-Z]{3}或者[A-Z]{3-6}后者将对所有内容开放。

相关内容