Docker+Nginx部署的Next.js静态站点www访问及路由404问题求助
问题分析与修复方案
一、解决https://www.mansourlotfi.ir 404错误
核心原因
- Dockerfile路径错误:你当前的Dockerfile使用
../etc/nginx/conf.d路径无效(容器工作目录默认是/,../指向不存在的上级目录),导致默认的Nginx配置文件未被删除,自定义配置也未正确加载,默认配置会处理未匹配的请求,返回404。 - Nginx未适配Cloudflare SSL转发:Cloudflare启用SSL后,用户访问HTTPS时,请求会转发到服务器的80或443端口,但你的Nginx仅配置了80端口的HTTP规则,且未统一处理所有域名的HTTP跳转。
修复步骤
修正Dockerfile路径
将Dockerfile修改为:FROM hub.hamdocker.ir/nginx:1.22.0 COPY ./out /project RUN rm /etc/nginx/conf.d/default.conf COPY ./nginx-configs /etc/nginx/conf.d更新Nginx配置文件
settings.conf
统一处理HTTP跳转,并适配Cloudflare的SSL转发:# 所有HTTP请求重定向到HTTPS主域名 server { listen 80; server_name mansourlotfi.ir www.mansourlotfi.ir c13.hamravesh.hamserver.ir; return 301 https://mansourlotfi.ir$request_uri; } # 处理HTTPS请求(兼容Cloudflare不同SSL模式) server { listen 80; # 适配Cloudflare Flexible模式(HTTP转发) listen 443 ssl; # 适配Cloudflare Full/Strict模式(需配置Origin证书) server_name mansourlotfi.ir; root /project; # 若使用Cloudflare Origin证书,添加以下两行(需提前将证书文件复制到容器内) # ssl_certificate /etc/nginx/certs/cloudflare-origin-cert.pem; # ssl_certificate_key /etc/nginx/certs/cloudflare-origin-key.pem; location / { index index.html; try_files $uri $uri.html $uri/ =404; } error_page 404 /404.html; location = /404.html { internal; } }检查Cloudflare配置
- 进入域名
SSL/TLS->Overview,若服务器未配置SSL证书,选择Flexible模式;若已配置Cloudflare Origin证书,选择Full或**Full (Strict)**模式。 - 确认
www.mansourlotfi.ir的CNAME记录已指向服务器IP,且代理状态为橙色云朵(启用Cloudflare代理)。
- 进入域名
二、解决不存在路由跳首页而非Next.js 404页面的问题
核心原因
当前try_files规则$uri $uri/ /index.html =404会在找不到文件/目录时直接返回首页,跳过了404触发逻辑。
修复步骤
在主域名的location /块中,调整try_files规则顺序,优先触发404:
location / { index index.html; # 先匹配静态文件、对应HTML文件、目录,都找不到则返回404 try_files $uri $uri.html $uri/ =404; }
这样访问不存在的路由(如/asd)时,Nginx找不到对应资源会触发404,进而返回Next.js生成的404.html页面。
三、重新部署应用
- 重新构建Docker镜像:
docker build -t nextjs-static-site . - 替换旧容器:
docker stop nextjs-site && docker rm nextjs-site docker run -d -p 80:80 -p 443:443 --name nextjs-site nextjs-static-site
内容的提问来源于stack exchange,提问作者mansour lotfi
相关产品推荐
相关产品推荐

