我有两个网络应用程序(node.js表达应用程序),web1
和web2
。这些网络应用预计会托管在通常类似http://www.web1.com
和http://www.web2.com
的网站上。我想将它们作为https://www.example.com/web1
和https://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
之类的相对链接,但不会被正确处理。
实现这一目标的最佳/标准方法是什么?
答案 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
。但是,使用地图是更安全的方式。