我正在尝试使用 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;
}