如何在nginx反向代理后为两个Web应用程序提供服务

des4xlb0  于 2023-02-11  发布在  Nginx
关注(0)|答案(3)|浏览(176)

我有两个web应用程序(node.js express apps),web1web2。这些web应用程序希望托管在通常类似http://www.web1.comhttp://www.web2.com的站点上。我希望将它们托管在nginx反向代理后,作为https://www.example.com/web1https://www.example.com/web2。我不希望将这两个web应用程序作为example.com上的两个子域公开。
下面是我希望能够实现这一点的nginx配置片段(没有SSL终止细节):

server {
  listen 443;
  server_name .example.com;

  location /web1 {
    proxy_pass http://www.web1.com:80;
  }

  location /web2 {
    proxy_pass http://www.web2.com:80;
  }
}

除了web应用使用的相对链接外,这是可行的,因此web应用web1将有一个类似/js/script.js的相对链接,这将无法正确处理。
实现这一目标的最佳/标准方法是什么?

ffx8fchx

ffx8fchx1#

您应该可以通过检查$http_referer来完成此操作,类似于:

location / {
  if ($http_referer ~ ^http://(www.)?example.com/web1) {
    proxy_pass http://www.web1.com:80;
  }

  if ($http_referer ~ ^http://(www.)?example.com/web2) {
    proxy_pass http://www.web2.com:80;
  }
}

浏览器在请求/js/script.js时会将引用设置为http://example.com/web1/some/page,因此应用程序不需要更改,除非它们需要在内部处理或关心引用。
$http_referer似乎不容易在nginx文档中找到,但在一些站点中提到过:

frebpwbc

frebpwbc2#

我是这样想的:

server {
  listen 443;
  server_name .example.com;
  location /web1 {
    proxy_pass http://www.web1.com:80;
  }
  location /web2 {
    proxy_pass http://www.web2.com:80;
  }
  location / {
    if ($http_referer ~* (/web1) ) {
        proxy_pass http://www.web1.com:80;
    }
    if ($http_referer ~* (/web2) ) {
        proxy_pass http://www.web2.com:80;
    }
  }
qyzbxkaa

qyzbxkaa3#

使用cookie和ngx_http_map_module怎么样?
add_header Set-Cookie "site=web1;Path=/;Domain=.example.com;";添加到location /web1 {...}(也添加web2)。
map添加到http

map $cookie_site $site {
  default http://www.web1.com:80;
  "web2" http://www.web2.com:80;
}

默认位置为

location / {
    proxy_pass $site;
}

您可以直接将cookie的值传递给proxy_pass,但是使用map是更安全的方法。

相关问题