You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker+Nginx部署的Next.js静态站点www访问及路由404问题求助

问题分析与修复方案

一、解决https://www.mansourlotfi.ir 404错误

核心原因

  1. Dockerfile路径错误:你当前的Dockerfile使用../etc/nginx/conf.d路径无效(容器工作目录默认是/,../指向不存在的上级目录),导致默认的Nginx配置文件未被删除,自定义配置也未正确加载,默认配置会处理未匹配的请求,返回404。
  2. Nginx未适配Cloudflare SSL转发:Cloudflare启用SSL后,用户访问HTTPS时,请求会转发到服务器的80或443端口,但你的Nginx仅配置了80端口的HTTP规则,且未统一处理所有域名的HTTP跳转。

修复步骤

  1. 修正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
    
  2. 更新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;
        }
    }
    
  3. 检查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页面。

三、重新部署应用

  1. 重新构建Docker镜像:
    docker build -t nextjs-static-site .
    
  2. 替换旧容器:
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 20:52:12