我想默认拒绝所有匿名用户,但允许匿名用户使用特定的虚拟路径;虚拟路径是由 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}
后者将对所有内容开放。