如何使用nginx将Next.js应用部署到子路径?

cczfrluj  于 2023-04-11  发布在  Nginx
关注(0)|答案(2)|浏览(442)

我的目标
我想将我的Next.js应用程序与nginx部署到子路径。

我的设置如下:

  1. Nginx配置
location /subpath/ {
  proxy_redirect                      off;
  proxy_set_header Host               $host;
  proxy_set_header X-Real-IP          $remote_addr;
  proxy_set_header X-Forwarded-For    $proxy_add_x_forwarded_for;
  proxy_set_header X-Forwarded-Proto  $scheme;
  proxy_read_timeout          1m;
  proxy_connect_timeout       1m;
  proxy_pass http://localhost:3030/;
}
  1. next.config.js
module.exports = {
    basePath: '/subpath'
 }

麻烦

此next.config.js导致mydomain.com/subpath/为404。
否则,mydomain.com/subpath/subpath显示页面。〉〈
(all其他页面也需要
/subpath/subpath/xxx

(每个链接href都指向404,所以我在地址栏中输入**/subpath/subpath/**来确认页面。

其他信息

next.js的版本是10.0.4

如何解决?

我很高兴能够获得将next.js应用程序部署到子路径的知识。最简单的方法更好。
我会很感激任何建议。先谢谢你。

8ehkhllq

8ehkhllq1#

根据配置这里的问题是尾部的斜杠,

location /subpath/ {
 proxy_pass http://localhost:3030/;
}

改成这个

location /subpath {
  proxy_pass http://localhost:3030;
}

完整的配置如下所示

location /subpath {
  proxy_redirect                      off;
  proxy_set_header Host               $host;
  proxy_set_header X-Real-IP          $remote_addr;
  proxy_set_header X-Forwarded-For    $proxy_add_x_forwarded_for;
  proxy_set_header X-Forwarded-Proto  $scheme;
  proxy_read_timeout          1m;
  proxy_connect_timeout       1m;
  proxy_pass http://localhost:3030;
}

背后的原因是默认情况下Next.js会将带斜杠的url重定向到不带斜杠的url。根据docs
但是你在Nginx配置中提到你的URL应该有尾随的斜杠。然后它会返回404。

cu6pst1q

cu6pst1q2#

摘要

1.修改next.config.js,增加basePath: '/subpath'
1.如果您使用的是public文件夹中的静态文件,请修改您使用的src,例如,

<Image
       src="/subpath/image.png"
       alt="Picture"
       width={500}
       height={500}
     />
  1. Nginx位置设置:
location /subpath {
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_pass http://127.0.0.1:3000;
    }

1.请记住,禁用您的浏览器缓存,当你尝试它。

真实的样本

  • conf(我的下一个项目运行在4000端口上)

  • next.config.js

  • 静态文件src用法

相关问题