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

NixOS上Nginx反向代理加载CSS/JS返回404问题求助

问题分析

你遇到的404本质是静态资源的路径解析错误:Golang服务里的静态资源用了绝对路径(比如/static/style.css),当通过https://server/myapp访问时,浏览器会把资源请求发往https://server/static/style.css(域名根路径),而不是https://server/myapp/static/style.css,但你的Nginx只配置了/myapp/的转发,没覆盖这些静态资源路径,导致404。

解决方案

因为要支持多容器,不能把所有/static请求指向同一个服务,所以有两种针对性的解决方式:

方案1:调整Golang服务的资源路径(推荐)

让服务生成的资源路径和访问前缀绑定,避免绝对路径的问题:

  • 如果用模板渲染页面,把资源引用改成相对路径,比如将<link href="/static/style.css">改为<link href="./static/style.css">;
  • 或者在Golang中配置路由前缀,比如把服务的根路由设为/myapp/,静态文件路由对应/myapp/static/和/myapp/js/,这样Nginx转发/myapp/到容器的/myapp/时,资源路径会自动匹配。

方案2:修改Nginx配置适配路径(无需改代码)

针对/myapp前缀下的所有子路径做转发,确保每个请求都能对应到Golang容器的正确路径。

Nginx配置示例(原生配置)

server {
    listen 443 ssl;
    server_name server.name;

    # SSL证书配置(NixOS下可通过ACME自动管理)

    # 匹配所有/myapp开头的请求,转发到容器对应路径
    location ~^/myapp/(.*) {
        proxy_pass http://localhost:8181/$1;
        # 传递必要的请求头,确保服务能正确处理
        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;
    }

    # 其他应用的转发配置,比如/myapp2
    location ~^/myapp2/(.*) {
        proxy_pass http://localhost:8282/$1;
        # 同上请求头配置
    }
}

NixOS下的configuration.nix配置写法

services.nginx = {
  enable = true;
  virtualHosts."server.name" = {
    enableACME = true; # 自动申请SSL证书
    forceSSL = true;
    locations = {
      # 正则匹配/myapp下的所有请求,转发到Golang容器
      "~^/myapp/(.*)" = {
        proxyPass = "http://localhost:8181/$1";
        extraConfig = ''
          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;
        '';
      };
      # 新增其他应用的转发规则
      "~^/myapp2/(.*)" = {
        proxyPass = "http://localhost:8282/$1";
        extraConfig = ''
          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;
        '';
      };
    };
  };
};
方案对比
  • 方案1:代码层面解决,路径逻辑更清晰,适合长期维护,但需要改动Golang服务代码;
  • 方案2:纯配置调整,无需修改服务,快速适配多容器场景,适合现有服务不想改动的情况。

内容的提问来源于stack exchange,提问作者hmaier

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 17:43:34