Nginx反向代理防止更改主机到其他位置



这几天我都在努力完成这件事,但我做不到。我有两个web应用程序,一个生产和一个测试,让我们说https://production.apphttps://testing.app。我需要在https://production.app/location下做一个指向https://testing.app/location的反向代理(目前我只需要prod中测试环境的一个功能)。我创建的配置确实代理了这个确切的位置,但该功能也从/static目录加载资源,导致请求到https://production.app/static/xyz.js而不是https://testing.app/static/xyz.js,并且不能代理/static。是否有一种方法来改变头只在这个代理流量,使它的https://testing.app/static(当然还有任何其他位置)?

下面是我当前的配置(只有关于代理的指令):

server {
listen 443 ssl;
server_name production.app;
root /var/www/production.app;
location /location/ {
proxy_pass  https://testing.app/location/;
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;
}
}

祝你今天愉快!)

你的题目写得不好。它与"更改标头"无关,而nginx位置虽然本质上与请求处理有关,但在这里也不是正确的术语。它应该是"如何以不同于其他方式提供代理页面请求的资产"之类的内容。

好的,我们开始。首先,您是否真正理解下面的配置究竟是什么?

location /location/ {
proxy_pass https://testing.app/location/;
}

https://testing.app上游名称后指定的URI前缀/location/具有如下作用:

  1. location指令中指定的/location/前缀,从被处理的URI中截断。
  2. 已处理的UIR在被传递到上游之前,在proxy_pass指令中指定/location/前缀。

也就是说,如果这些前缀相等,下面的配置将做同样的事情,消除这些步骤(因此处理请求的效率略高):

location /location/ {
proxy_pass https://testing.app;
}

理解这一点是我们将要使用的技巧的一个关键概念。

因为从/location/页面发出的所有静态资产请求都将具有等于http://production.app/location/的HTTPReferer头(好吧,除非你指定no-referer作为页面引用策略,如果你是,整个技巧将根本不起作用,除非你改变它),我们可以重写一个匹配某些条件的请求URI(比如以/static//img/前缀开始),使用以下if块(应该放在server配置级别)将其重定向到一些特殊的内部位置:

if ($http_referer = https://production.app/location/) {
rewrite ^/static/ /internal$uri;
rewrite ^/img/ /internal$uri;
...
}

我们可以使用任何前缀,这里使用的/internal只是一个例子,但是使用的前缀不应该干扰你现有的路由。接下来,我们将使用internal关键字定义这个特殊位置:

location /internal/ {
internal;
proxy_pass https://testing.app/;
}

http://testing.app上游名称后面的尾斜杠是必不可少的部分。它将使被代理的URI返回到其原始状态,删除rewrite指令之前添加的/internal/前缀,并用单个斜杠替换它。

您可以使用此技巧在多个页面使用regex模式来匹配Referer头值,例如

if ($http_referer ~ ^https?://production.app/(page1|page2|page3)/) {
...
}

你不应该在静态资源之外的任何地方尝试这样做,否则它会破坏应用的路由机制。这也只是一个应该用于测试目的的变通方法,而不是我可以长期推荐用于生产使用的方法。


你确定你真的需要那个

proxy_set_header Host $host;

行在您的位置?你真的明白它是什么意思吗或者你只是从其他配置中复制粘贴?检查这个答案,如果出了什么问题,不要感到惊讶。

相关内容

最新更新