如何设置 NGINX 反向代理同时保留静态资源的相对 URL?

如何设置 NGINX 反向代理同时保留静态资源的相对 URL?

我正在尝试使用 NGINX 中的 proxy_pass 设置反向代理。页面加载正常,但所有使用相对 URL 的静态辅助 (js、css、imgs) 都会中断,因为它会在前面添加父服务器的主机名。有没有办法使用反向代理,同时为所有静态资源保留代理主机名?

家长配置文件

server {
    listen 80;
    server_name parent.mydomain.com;
    return 301 https://$server_name$request_uri;
}

server {

    listen 443 ssl;

    server_name parent.mydomain.com;
    root /var/www/parent;
    index index.html;

    try_files $uri.html $uri $uri/ =404;

    # error and access out
    error_log /var/log/error.log;
    access_log /var/log/access.log;

    ssl on;
    ssl_certificate /etc/ssl/myssl.pem;
    ssl_certificate_key /etc/ssl/myssl-key.pem;

    # Here is the important part. Any url matching 
    # this pattern needs to proxy_pass to child. 
    location ~ "^/[a-z0-9]{24}$" {

        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-NginX-Proxy true;
        proxy_set_header X-Forwarded-Proto $scheme;

        proxy_pass https://child.mydomain.com;

        proxy_redirect off;
    }

}

子配置文件

server {
    listen 80;
    server_name child.mydomain.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443;
    server_name child.mydomain.com;
    root /var/www/child;

    ssl on;
    ssl_certificate /etc/ssl/myssl.pem;
    ssl_certificate_key /etc/ssl/myssl-key.pem;

    error_log /var/log/child.log;
    access_log /var/log/child.log;

    # this is a single page app so all request
    # should be routed through index.html.
    location / {
        try_files $uri /index.html;
    }
}

现在,如果我点击https://parent.mydomain.com/54570f77968d6e492b0d68af索引页,child.mydomain.com可以正常加载,但我的静态文件都无法加载,因为它们试图在https://parent.mydomain.com它们实际所在的位置加载https://child.mydomain.com/js/main.js

答案1

而不是反向代理“ip”地址(proxy_passhttp://127.0.0.1:9003),尝试 proxy_passhttp://你的主机名BehindReverseProxy:9003

然后将 YourHostNameBehindReverseProxy 添加到 /etc/hosts 并与 127.0.0.1 关联。

答案2

@cnst 除了索引页之外,我不希望父级从子级加载任何内容。我需要所有静态资源的主机保留为 child.mydomain.com – jwerre 7 分钟前

那么,您的问题似乎与 serverfault 无关。

实现您想要的最佳方式是使用来<base href='https://child.mydomain.com/'/>确保浏览器始终从以下位置加载所有资源child.mydomain.com

<html>
   <head>
      <base href='https://child.mydomain.com/'/>

或者,如果你没有其他想要在父级内部提供的东西,那么你可以简单地做一个301 Moved将所有 404 页面重定向至子页面。

    error_page 404 =301 http://child.mydomain.com$request_uri;

或者,更好的是,将您的请求try_files从父级中移除,并将所有与更具体位置不匹配的请求重定向到子级:

location / {
    return 301 http://child.mydomain.com$request_uri;
}

相关内容