子目录 /resources 中的 NGINX Next.js 和 WordPress - 带有“帖子名称”的 WordPress 永久链接不起作用

问题描述 投票:0回答:1

我有一台运行 Next.js 应用程序和一个 WordPress 网站的服务器。 Next.js 应用程序在根 (/) 路径上提供服务,并通过 pm2 在端口 3000 上运行。 WordPress 安装在位于 /var/www/html/wordpress/resources 子目录中。我的 NGINX 服务器配置如下:

server {
  server_name example.app www.example.app;

  location /resources {
    alias /var/www/html/wordpress;
    index index.php index.html;

    try_files $uri $uri/ /index.php$is_args$args;

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php8.1-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $request_filename;
        include fastcgi_params;
    }
  }

location / {
    proxy_pass http://localhost:3000;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;
 }

 location ~ /.well-known {
    allow all;
 }

当 WordPress 永久链接设置为“普通”时,此方法效果很好,例如 https://example.app/resources/?p=123。但是,当我将永久链接更改为“帖子名称”时,例如 https://example.app/resources/sample-post/,它开始路由到 Next.js 应用程序,并收到 500 错误。 经过一番搜索,我将 WordPress 的 NGINX 配置更新为:

location /resources {
  client_max_body_size 10M;
  alias /var/www/html/wordpress;
  index index.php index.html;

  try_files $uri $uri/ /index.php$is_args$args;

  location ~ \.php$ {
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/run/php/php8.1-fpm.sock;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
  }
 }

现在,我面临的问题是 URL https://example.app/resources/sample-post/ 返回文件未找到错误,并且 WordPress 永久链接不再起作用。

我需要什么帮助: 如何让带有 '帖子名称' 的 WordPress 永久链接在 /resources 路径下工作,而不干扰我在 / 上的 Next.js 路由? 是否有更好的方法来配置 NGINX 以在此设置中正确处理 Next.js 和 WordPress? 任何建议或见解将不胜感激!

wordpress nginx next.js
1个回答
0
投票

在这个问题上苦苦挣扎了几天,并尝试了 Copilot 和 ChatGPT 的各种解决方案但没有成功后,我终于通过 Reddit 帖子 和它引用的 blog 找到了解决方案。

问题在于 /resources 下的 WordPress 永久链接未正确路由到 WordPress,特别是在使用“帖子名称”结构时。根本原因是 NGINX 没有正确处理嵌套永久链接,导致与我的 Next.js 路由发生冲突。

这是最终对我有用的 NGINX 配置:

location /resources {
    alias /var/www/html/wordpress;
    index index.php index.html;
    
    # Try files and redirect to @nested if the file isn't found
    try_files $uri $uri/ @nested;

    # PHP processing for WordPress
    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php8.1-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $request_filename;
        include fastcgi_params;
    }
}

# Handle nested permalinks for WordPress
location @nested {
    rewrite /resources/(.*)$ /resources/index.php?/$1 last;
}

说明:

try_files $uri $uri/ @nested;

这会尝试提供请求的文件或目录,如果找不到,则将请求发送到指定位置(@nested)。

@嵌套位置

这里的重写规则确保像 /resources/sample-post/ 这样的请求被路由到 /resources/index.php,从而允许 WordPress 正确处理永久链接。

© www.soinside.com 2019 - 2024. All rights reserved.