Nginx reverse proxy on nixOS returns 404 when trying to load css/js

王林
Release: 2024-02-10 13:09:07
forward
529 people have browsed it

nixOS 上的 Nginx 反向代理在尝试加载 css/js 时返回 404

php editor Baicao introduced that when using Nginx reverse proxy on nixOS, you sometimes encounter a problem: a 404 error is returned when trying to load css/js. This problem may cause the website's style and functionality to not display properly. In order to solve this problem, we need to check whether the Nginx configuration and file path are correct, and ensure that the proxy server can correctly access and load the required static resources. Through careful troubleshooting and debugging, we can solve this problem and ensure the normal operation of the website.

Question content

I have set up nixos to run nginx as a reverse proxy for docker containers. Running a golang server in a docker container that uses functions to handle / and returns files from two folders static and js . It runs on port 8181. The code is as follows:

func main() {
        static := http.fileserver(http.dir("static"))
        js := http.fileserver(http.dir("js"))
        http.handle("/static/", http.stripprefix("/static/", static))
        http.handle("/js/", http.stripprefix("/js/", js))
        // register function to "/"
        http.handlefunc("/", indexhandler)
        fmt.println("server is starting...")
        err := http.listenandserve("0.0.0.0:8181", nil)
        if err != nil {
                log.fatal("cannot listen and server", err)
        }
        
}
func indexhandler(w http.responsewriter, r *http.request) {
        wd, err := os.getwd()
        var static = filepath.join(wd, "static")
        var index = filepath.join(static, "index.html")
        if err != nil {
                log.fatal("cannot get working directory", err)
        }

        // check if the request is an options preflight request
        if r.method == "options" {
                // respond with status ok to preflight requests
                w.writeheader(http.statusok)
                return
        }

        // post-request
        if r.method == http.methodpost {
              // do something
        } else {
                // loading the index.html without any data
                tmpl, err := template.parsefiles(index)
                err = tmpl.execute(w, nil) // write response to w
                if err != nil {
                        http.error(w, err.error(), http.statusinternalservererror)
                        log.fatal("problem with parsing the index template ", err)
                }

        }
}
Copy after login

The structure of my application is as follows.

├── web
│   ├── dockerfile
│   ├── go.mod
│   ├── server.go
│   └── static
│   │   ├── index.html
│   │   ├── style.css
│   │   └── table.html
│   └── js
│       └── htmx.min.js
Copy after login
The configuration of the

nginx part in configuration.nix is as follows.

  services.nginx = {
    enable = true;
    recommendedGzipSettings = true;
    recommendedOptimisation = true;
    recommendedProxySettings = true;
    recommendedTlsSettings = true;
    virtualHosts."myapp" = {
      sslCertificate = "/etc/ssl/nginx/ssl.cert";
      sslCertificateKey = "/etc/ssl/nginx/ssl.key";
      sslTrustedCertificate = "/etc/ssl/nginx/ssl.chain";
      forceSSL = true; # Redirect HTTP to HTTPS
      locations = {
        "/myapp" = { proxyPass = "http://localhost:8181/"; };
      };
      extraConfig = ''
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      '';
    };

  };
Copy after login

When I address https://server/myapp, index.html will load, but style.css and htmx. min.js will return 404.

When the container is addressed using port 8181 instead of the url (http://server:8181), everything will load as usual.

I want nginx to redirect requests to load css and js to the container.

edit: The exact error is: get https://server.name/static/style.css net::err_aborted 404 even though I'm accessing https://server.name/myapp.

Another important information is that I want to run multiple containers this way through the same reverse proxy. Therefore, directing als css- or js-files to the same location will not work.

Solution

Please check the css/js reference in the index.html file. You'll most likely reference them via absolute paths, like this:

<html>
  <head>
    <link rel="stylesheet" type="text/css" href="/static/style.css" />
    <script src="/js/htmx.min.js"></script>
  </head>
</html>
Copy after login

A quick fix is ​​to replace them with relative paths:

<html>
  <head>
    <link rel="stylesheet" type="text/css" href="./static/style.css" />
    <script src="./js/htmx.min.js"></script>
  </head>
</html>
Copy after login

This method is error-prone. A better approach is to modify the application to serve the content at /myapp:

http.handle("/myapp/static/", http.stripprefix("/myapp/static/", static))
http.handle("/myapp/js/", http.stripprefix("/myapp/js/", js))
http.handlefunc("/myapp/", indexhandler)
Copy after login

And modify the reference path in the index.html file:

<html>
  <head>
    <link rel="stylesheet" type="text/css" href="/myapp/static/style.css" />
    <script src="/myapp/js/htmx.min.js"></script>
  </head>
</html>
Copy after login

Then modify the nginx configuration:

locations = {
  "/myapp/" = { proxyPass = "http://localhost:8181/myapp/"; };
};
Copy after login

With this approach, the web application will always be served on uri /myapp/ regardless of whether a reverse proxy is used, which should make it easy to maintain.

The above is the detailed content of Nginx reverse proxy on nixOS returns 404 when trying to load css/js. For more information, please follow other related articles on the PHP Chinese website!

source:stackoverflow.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!