You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过根目录.htaccess屏蔽/blog目录,仅允许指定子路径访问?

如何通过根目录.htaccess屏蔽/blog目录,仅允许指定子路径访问?

兄弟,我看你这问题太典型了——WP自带的.htaccess确实是隐形的“规则拦截器”,再加上你根目录的规则本身有逻辑矛盾,难怪之前的配置完全不生效。咱们一步步拆解问题,给你两个靠谱的解决方案:

问题出在哪?

  1. WP的.htaccess优先级拦截:当请求指向/blog下的内容时,Apache会先处理/blog/.htaccess里的规则——WP的配置会把所有非静态文件/目录的请求都转发到index.php,导致你根目录的规则根本没机会触发。
  2. 根目录规则的逻辑矛盾:你之前写的条件里有完全冲突的判断(比如同时要求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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 12:04:32