问题现象:

  • WordPress 固定链接结构只能用"朴素"模式,改成其他格式文章就 404。
  • 更新文章时报错:“更新失败。响应不是有效的 JSON 响应。”

原始的 nginx 配置:

server {
    server_name example.com;
    ...

    root /var/www/wordpress;
    index index.php index.html;

    location / {
        try_files $uri $uri/ $uri.html =404;
    }

    ...
}

排查后发现根本原因是 nginx 无法将子路径重定向到 WordPress。

“朴素"固定链接没有子路径,只有查询字符串:https://52.175.32.36/?p=123,所以上面的配置能正常工作。一旦改了固定链接结构,URL 变成子路径形式,上面的规则就处理不了路由了。

修改 nginx 配置如下,然后重启 nginx:

server {
    server_name example.com;
    ...

    root /var/www/wordpress;
    index index.php index.html;

    location / {
        # 文件 ($uri) 或目录 ($uri/) 都不存在时,重定向到 /index.php + 查询字符串
        try_files $uri $uri/ /index.php?$args;
        index  index.html index.htm index.php;
    }

    ...
}

关键改动就是把 =404 改成 /index.php?$args,让 nginx 把无法匹配的子路径请求转发给 WordPress 的 index.php 处理。