我有一台运行 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? 任何建议或见解将不胜感激!
在这个问题上苦苦挣扎了几天,并尝试了 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 正确处理永久链接。