如何通过根目录.htaccess屏蔽/blog目录,仅允许指定子路径访问?
如何通过根目录.htaccess屏蔽/blog目录,仅允许指定子路径访问?
兄弟,我看你这问题太典型了——WP自带的.htaccess确实是隐形的“规则拦截器”,再加上你根目录的规则本身有逻辑矛盾,难怪之前的配置完全不生效。咱们一步步拆解问题,给你两个靠谱的解决方案:
问题出在哪?
- WP的.htaccess优先级拦截:当请求指向
/blog下的内容时,Apache会先处理/blog/.htaccess里的规则——WP的配置会把所有非静态文件/目录的请求都转发到index.php,导致你根目录的规则根本没机会触发。 - 根目录规则的逻辑矛盾:你之前写的条件里有完全冲突的判断(比如同时要求
REQUEST_URI是/wp-login.php和REQUEST_URI不是/wp-login.php),这种矛盾条件永远不可能同时满足,规则自然不会执行。
解决方案1:修复根目录.htaccess规则(适合不想碰WP配置的情况)
把根目录的.htaccess替换成下面的代码,我已经帮你修复了逻辑,并且调整了规则顺序,确保允许的请求能正常通过,其他请求被拦截:
RewriteEngine On # 1. 允许访问/blog/wp-admin/及其所有子路径 RewriteRule ^blog/wp-admin/ - [L] # 2. 允许访问/blog/wp-json/及其所有子路径 RewriteRule ^blog/wp-json/ - [L] # 3. 允许访问/blog/wp-login.php登录页 RewriteRule ^blog/wp-login\.php$ - [L] # 4. 拦截所有其他/blog/下的请求,重定向到网站根目录(301永久重定向) RewriteRule ^blog/ / [L,R=301] # 你的原有规则(保留即可) Redirect 301 /tmp / ErrorDocument 404 /error/404.html
规则解释:
RewriteRule ^xxx - [L]:表示“匹配到这个路径时,不做任何重写,直接结束当前规则集”,这样允许的请求会顺利进入WP的.htaccess规则,正常处理。- 规则是从上到下匹配的,所以允许的规则必须放在拦截规则之前,否则拦截规则会先触发,把所有请求都重定向走。
解决方案2:修改/blog目录的.htaccess(更可靠,推荐)
因为WP会自动覆盖# BEGIN WordPress和# END WordPress之间的规则,所以我们把自定义拦截规则加在这个标记块之前,这样就不会被WP的自动更新覆盖,而且直接在请求的目标目录处理,优先级最高。
修改后的/blog/.htaccess如下:
# 自定义拦截规则 - 必须放在WP自动生成的规则之前,避免被覆盖 <IfModule mod_rewrite.c> RewriteEngine On # 允许的白名单路径 RewriteRule ^wp-admin/ - [L] RewriteRule ^wp-json/ - [L] RewriteRule ^wp-login\.php$ - [L] # 拦截所有其他请求,重定向到根目录(如果想返回403禁止访问,就把这里改成 RewriteRule ^ - [R=403,L]) RewriteRule ^ / [L,R=301] </IfModule> # BEGIN WordPress # Direktiverne (linjer) mellem 'BEGIN WordPress' og 'END WordPress' er # dynamisk genereret og bør kun ændres via WordPress-filtre. # Eventuelle ændringer i direktiverne mellem disse markører vil blive overskrevet. <IfModule mod_rewrite.c> RewriteEngine On RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] RewriteBase /blog/ RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /blog/index.php [L] </IfModule> # END WordPress
验证方法
修改完配置后,一定要清除浏览器缓存(因为301重定向是永久缓存的),然后测试:
- ✅ 访问
example.com/blog/wp-admin:应该正常进入WP后台 - ✅ 访问
example.com/blog/wp-json/wp/v2/posts:应该正常返回API数据 - ✅ 访问
example.com/blog/wp-login.php:应该正常显示登录页 - ✅ 访问
example.com/blog/或example.com/blog/任意其他路径:应该被重定向到example.com/(或者返回403,取决于你选的规则)
内容来源于stack exchange
相关产品推荐
相关产品推荐

