我正在尝试使用 Nginx 在服务器 (Ubuntu 14.04) 上运行一些 nodejs 应用程序,并且我快完成了。这是我的服务器配置 ( /etc/nginx/sites-available/default
):
server {
listen 80;
server_name my_domain.com;
location /test1 {
proxy_pass http://127.0.0.1:5000/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
location /test2 {
proxy_pass http://127.0.0.1:5001/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
我已经运行了几个应用程序,它们都运行良好,我可以使用http://my_domain.com/test1
、http://my_domain.com/test2
等访问它们......
问题是在其中一个应用程序中我有几个绝对路径:
例如<a href="/">Home</a>
或(在 express 内部)
res.redirect('/');
此重定向不会转到,http://my_domain.com/test1
但它们会转到http://my_domain.com/
是否有办法通过 nginx 配置来告诉应用程序根位置实际上是http://my_domain.com/test1
?
我对 nginx 和虚拟主机还很陌生,我正在努力学习...如能得到任何帮助我将不胜感激。
编辑:
其结果curl -I http://127.0.0.1:5000
是:
HTTP/1.1 200 OK
X-Powered-By: Express
Content-Type: text/html; charset=utf-8
Content-Length: 1376
ETag: W/"560-GGm/YYltkhKxiOVNZ99jqQ"
set-cookie: connect.sid=s%3AkZYCqLKvbhHhK3W8ECBN8G91s41paws4.ekLWefrd3NdQatT3VzFNozfnFs65YBEW9k9MNTdbQT0; Path=/; HttpOnly
Date: Sat, 15 Aug 2015 13:13:20 GMT
Connection: keep-alive
正如您所看到的,我没有获得位置标头...
顺便说一句,我设法使用子域名解决了该问题,这似乎按我预期的方式工作......无论如何,我将不胜感激您的答复,因为我将来可能会需要它。
答案1
我发现实现这个功能的唯一方法是使用HttpSubModule并添加sub_filter
指令。根据您的示例,它可能看起来像这样:
sub_filter 'href="/' 'href="/test1/';
sub_filter "redirect('/')" "redirect('/test1/')";
显然,匹配越具体,您需要添加的选项就越多。如果您不太具体,比如只匹配,"/
那么'/
您需要的规则就更少,但可能会遇到替换错误内容的危险。
您可能还需要添加:
sub_filter_types *;
因此它不仅匹配text/html
(这是默认设置),还匹配 javascript 和 css 文件。显然,这*
是一种偷懒的方法,可能会破坏一些东西,使用特定的 mimetypes 应该是首选。
最终正确的方法是修复 Web 应用程序。大多数 Web 框架都支持类似基本 URL/根 URL/URL 前缀(似乎没有标准名称)的内容,您可以设置这些内容来避免此问题。