如何在全局拒访的.htaccess中放行WordPress虚拟JSON Feed?
嘿,这个坑我之前踩过!
给你两种亲测有效的解决方案,选一个适合你的就行:
方案一:用RewriteRule放行(推荐,和WordPress重写兼容性更好)
这个方法是通过Rewrite规则直接匹配虚拟端点,让Apache跳过后续的验证规则。你可以根据自己的Apache版本选择代码:
如果你用的是Apache 2.4+(现在大多数服务器都是这个版本)
# 先启用重写引擎 RewriteEngine On # 放行你的JSON Feed虚拟端点(把^feed/json/?$换成你的实际端点路径) # [L]表示匹配到就停止后续规则处理,[NC]是不区分大小写(可选) RewriteRule ^feed/json/?$ - [L,NC] # 对剩下的所有请求启用密码验证 AuthType Basic AuthName "Restricted Area" AuthUserFile /path/to/your/.htpasswd # 替换成你实际的.htpasswd文件路径 Require valid-user # 下面是WordPress默认的重写规则(如果你的.htaccess里已经有了,就不用重复加) RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L]
如果你还在使用Apache 2.2(比较老的版本)
# 先启用重写引擎 RewriteEngine On # 放行你的JSON Feed虚拟端点 RewriteRule ^feed/json/?$ - [L,NC] # 对剩下的所有请求启用密码验证 AuthType Basic AuthName "Restricted Area" AuthUserFile /path/to/your/.htpasswd Require valid-user # 默认拒绝所有未通过验证的访问 Order Deny,Allow Deny from all Satisfy Any # WordPress默认重写规则(已有则跳过) RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L]
方案二:用指令(适合明确知道端点路径的情况)
return (<Location>是直接匹配URL路径的,不管是不是真实文件,刚好适合虚拟端点。同样分版本: ### Apache 2.4+ ```apache # 先对所有路径启用密码验证 AuthType Basic AuthName "Restricted Area" AuthUserFile /path/to/your/.htpasswd Require valid-user # 单独放行JSON Feed虚拟端点 <Location "/feed/json"> # 替换成你的实际端点路径,带斜杠的话就写"/feed/json/" Require all granted </Location> )
WordPress默认重写规则(已有则跳过)
RewriteEngine On
RewriteBase /
RewriteRule ^index.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
### Apache 2.2 ```apache # 先对所有路径启用密码验证 AuthType Basic AuthName "Restricted Area" AuthUserFile /path/to/your/.htpasswd Require valid-user # 单独放行JSON Feed虚拟端点 <Location "/feed/json"> Order Allow,Deny Allow from all Satisfy Any # 让Apache只要满足Allow条件就跳过验证 </Location> # WordPress默认重写规则(已有则跳过) RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L]
几个重要的注意点:
- 一定要把
/path/to/your/.htpasswd替换成你服务器上.htpasswd文件的真实路径,比如/home/yourusername/.htpasswd - 替换示例中的
^feed/json/?$或"/feed/json"为你的JSON Feed的实际URL路径,比如如果你的端点是/wp-json/custom/feed/,就改成对应的内容 - 测试的时候记得清空浏览器缓存,不然之前的认证缓存会影响测试结果
- 如果你的.htaccess里已经有WordPress的默认重写规则,别重复添加,把放行/验证规则放在它前面就行
内容的提问来源于stack exchange,提问作者Jacksonkr
相关产品推荐
相关产品推荐

