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

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后台设置

  1. 为什么用root替代alias?
    root的路径计算逻辑更直接($document_root + $uri),不会和try_files的内部跳转产生冲突,彻底避免了alias的兼容性问题。

  2. 必要的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;
    

对之前问题的复盘

  • 初始配置的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 12:07:38