Nginx环境下WordPress作为子目录部署时文章页面返回404的问题排查与优化需求
解决Nginx子目录部署WordPress的404与重定向循环问题
根本原因分析
你遇到的问题本质上是Nginx的alias指令与try_files、PHP处理块之间的兼容性BUG,官方文档也明确提到不建议将alias和try_files混用——当使用alias映射子目录到实际文件根目录时,try_files的内部跳转请求会忽略alias的路径映射,转而使用Nginx全局默认的root路径(比如你的日志里的/etc/nginx/html),导致找不到WordPress的index.php文件,触发404。
后续尝试分离PHP块或调整try_files规则时,又因为WordPress的URL路由逻辑与Nginx的路径映射不匹配,出现了主页/后台404、重定向循环等问题——核心是没有让Nginx和WordPress对"站点根路径"达成一致的认知。
优化后的简洁配置方案
下面的配置彻底规避了alias的坑,用root+内部重写的方式实现子目录部署,同时保证所有页面(主页、文章、后台)正常访问:
server { listen 80; listen [::]:80; server_name www.test.com; # 静态资源配置保持不变 location ^~ /media { alias /var/local/test/static/media; } location ^~ /icons { alias /var/local/test/static/icons; } # 设置WordPress文件的实际根目录 root /var/www/html; index index.php; # 把/blog开头的请求内部重写为根路径请求,让WordPress处理路由 location /blog { rewrite ^/blog(/.*)?$ $1 last; } # 统一处理所有PHP请求,确保路径解析正确 location ~ \.php$ { try_files $uri =404; include fastcgi_params; fastcgi_intercept_errors on; fastcgi_pass blog-test:9000; # 关键:正确传递脚本文件路径和信息给PHP-FPM fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_split_path_info ^(.+\.php)(/.+)$; } # WordPress固定链接核心规则:当文件/目录不存在时,转发到index.php处理路由 location / { try_files $uri $uri/ /index.php?$args; } }
配置说明&WordPress后台设置
为什么用
root替代alias?root的路径计算逻辑更直接($document_root + $uri),不会和try_files的内部跳转产生冲突,彻底避免了alias的兼容性问题。必要的WordPress后台配置
登录WordPress后台,进入「设置」→「常规」:- 设置**站点地址(URL)**为
http://www.test.com/blog(对外展示的访问地址) - 设置**WordPress地址(URL)**为
http://www.test.com(服务器上WordPress文件的实际根路径)
如果不想修改后台设置,可以在PHP处理块中添加以下参数,让WordPress自动识别子目录:
fastcgi_param SCRIPT_NAME /blog$fastcgi_script_name; fastcgi_param PHP_SELF /blog$fastcgi_script_name;- 设置**站点地址(URL)**为
对之前问题的复盘
- 初始配置的404:
try_files跳转后的/blog/index.php请求触发了Nginx的alias+try_filesBUG,导致使用全局默认root查找文件。 - 分离PHP块后的主页404:WordPress无法识别请求来自
/blog子目录,生成的路由链接与Nginx的路径映射不匹配。 - 重定向循环:后台的
/wp-admin请求被Nginx重定向到根路径,而WordPress期望它在/blog/wp-admin下,导致循环跳转。
内容的提问来源于stack exchange,提问作者Bülent Sezer
相关产品推荐
相关产品推荐

