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

时间:2016-01-08 19:50:05

标签: express nginx proxy

我有两个网络应用程序(node.js表达应用程序),web1web2。这些网络应用预计会托管在通常类似http://www.web1.comhttp://www.web2.com的网站上。我想将它们作为https://www.example.com/web1https://www.example.com/web2托管在nginx反向代理后面。我不想将这两个网络应用程序公开为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;
  }
}

除了网络应用使用的相对链接外,此方法有效。因此,网络应用web1将包含/js/script.js之类的相对链接,但不会被正确处理。

实现这一目标的最佳/标准方法是什么?

3 个答案:

答案 0 :(得分:4)

我认为是这样的: 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; } } }

答案 1 :(得分:4)

您应该可以通过查看$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;
  }
}

浏览器会在请求http://example.com/web1/some/page时将引用设置为/js/script.js,因此应用程序不需要更改,除非他们需要在内部处理或关注引用程序。

$ http_referer似乎不容易在nginx文档中找到,但在一些网站中提到:

答案 2 :(得分:1)

如何使用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。但是,使用地图是更安全的方式。