关于nginx通过子路径反向代理,nodejs+express服务器+angular不成功的问题
发布于 10 年前 作者 leonkaihao 9391 次浏览 最后一次编辑是 8 年前 来自 问答

这个问题我搜了一天仍然没有解决办法,咨询各位大虾有没有类似经验分享 我的问题场景是这样的: nginx 80端口,通过子路径/v2/admin反向代理同一台PC上运行的nodejs服务器(3200端口,使用express框架,前端页面使用angularjs) nginx的配置是这样的: upstream admin_server_pool { server 127.0.0.1:3200 weight=4 max_fails=2 fail_timeout=30s; } location /v2/admin/ { rewrite ^/v2/admin/(.*) /$1 break; rewrite ^/v2/admin$ /v2/admin/ permanent; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $proxy_host; proxy_set_header X-NginX-Proxy true;

    proxy_pass http://admin_server_pool;
    proxy_redirect http://admin_server_pool/ /v2/admin;

}

然后通过http://[hostIP]/v2/admin访问nodejs服务器,首页加载正常,页面资源获取正常,

接着点页面的登录按钮,angular通过$http向server发送登录请求 $http.get(’/login’, { params: dataObj, timeout: (1000 * 30) })… 这里就出问题了,提示信息: GET http://[hostIP]/login?password=xxx&userName=yyy 404 (Not Found) 可以看到请求的[hostIP]后面没有带上/v2/admin/,造成资源请求失败。

我的分析是: 页面可以获取到,说明nginx的反向代理和转发没有问题,nodejs server的工作也正常 页面资源的正确加载,说明html5的baseURL正确定位到了/v2/admin/ 那问题点就在angular的$http.get请求,

然后我去刷新http://[hostIP]/v2/admin,用$location.host()查看,果然是[hostIP] 用$location.path()查看,是“/”,显然/v2/admin/被忽略掉了, 我将页面调试器打开,看response的http header,主要信息如下: Response Headers: Connection:keep-alive Content-Length:184 Content-Type:text/html Date:Fri, 17 Apr 2015 06:23:30 GMT Location:http://[hostIP]/v2/admin/ Server:nginx/1.6.3 Request Headers: Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8 Accept-Encoding:gzip, deflate, sdch Accept-Language:zh-CN,zh;q=0.8 Connection:keep-alive Cookie:connect.sid=s%3APwSh7XGy6iH9bn3C0li9VM9EuKhxah5f.Pk6i8MI3UK7rTutU2C5AcEbzot97NvSQeSD7P2OvU0s Host:172.21.2.21 <-----------注意这里,按我想应该是172.21.2.21/v2/admin才对

我的问题是: 1.是前端angular的$location.host()决定了$http请求的前缀吗? 2.是nodejs server返回的Host信息决定了$location.host()的值吗? 3.nodejs server如何向前端传递host信息,才能使前端的$http请求的定位是正确的?上面遇到的问题是否是nodejs的bug? 4.此问题有哪些解决办法?是应该通过angular或nodejs server或是nginx来解决?

我的问题太多,欢迎大家一起分别讨论和解决,thanks~

3 回复

接着点页面的登录按钮,angular通过$http向server发送登录请求 $http.get(’/login’, { params: dataObj, timeout: (1000 * 30) })… 这里就出问题了,提示信息: GET http://[hostIP]/login?password=xxx&userName=yyy 404 (Not Found) 可以看到请求的[hostIP]后面没有带上/v2/admin/,造成资源请求失败。

你不是在 http get ‘/login’ 吗?怎么要求 /v2/admin/? 没看懂

@russj Get请求应该是http://[hostIP]/v2/admin/login?password=xxx&userName=yyy 而不是http://[hostIP]/login?password=xxx&userName=yyy 不然到请求到达nginx server,就不能转到nodejs服务器上

楼主认为ajax请求也是受页面上定义的base url影响的,但实际可能是无关的。

回到顶部