public目录下blog路由排除失败,访问域名/blog出现404错误
解决方案
你的核心问题是当前.htaccess规则没有优先处理/blog的请求,反而让它被后续的public目录转发或主站index.php接管了。以下是调整后的配置方案:
修改后的根目录.htaccess代码
<IfModule mod_rewrite.c> <IfModule mod_negotiation.c> Options -MultiViews </IfModule> RewriteEngine On # 优先处理/blog请求,直接指向public下的WordPress目录 RewriteRule ^blog/(.*)$ public/blog/$1 [L] RewriteRule ^blog$ public/blog/ [L] # 处理现有文件/目录的直接访问 RewriteCond %{REQUEST_FILENAME} -d [OR] RewriteCond %{REQUEST_FILENAME} -f RewriteRule ^ ^$1 [N] # 转发带后缀的静态资源到public目录 RewriteCond %{REQUEST_URI} (\.\w+$) [NC] RewriteRule ^(.*)$ public/$1 [L] # 非文件/目录的请求交给主站index.php处理 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [L] </IfModule>
关键调整说明
- 前置Blog规则:新增的两条
RewriteRule放在最顶部,确保所有/blog开头的请求直接跳转到public/blog目录,[L]标记表示这是当前匹配的最后一条规则,不会触发后续主站路由逻辑。 - 移除冗余排除条件:删掉了原配置中两处
RewriteCond $1 !^(blog),因为已经通过前置规则单独处理了Blog请求,无需重复排除。 - 保留WordPress自治:确保
public/blog目录下存在WordPress自动生成的默认.htaccess文件(包含WordPress自身的重写规则),这样WordPress才能正常处理内部文章、页面的路由。
额外检查项
- 确认
public/blog目录权限为755,文件权限为644,保证Apache服务器能正常读取访问。 - 检查Apache是否启用了
mod_rewrite模块,Linux服务器可通过a2enmod rewrite命令启用,重启Apache生效。 - 确保网站根目录的服务器配置(VirtualHost或Directory块)中设置了
AllowOverride All,否则.htaccess规则无法生效。
内容的提问来源于stack exchange,提问作者Tariq Khan
相关产品推荐
相关产品推荐

