碰到的问题
今天做了一个feature的admin的接口api/xxv/abc/feature,便于ops在admin上直接管理配置信息。但是我们的域名是 ttt.company.com,所以admin应该访问
http://ttt.company.com/api/xxv/abc/feature
但是admin的域名是admin(-test).company.com,而且admin后台是需要登录的。这样就导致了前端跨域传cookie会有问题。
解决的方案
nginx 做请求转发
目前的做法是在服务端之前做一个反向代理,admin请求同域名的
http://admin-test.company.com/api/abc/feature
然后在nginx层将请求转发到
http://ttt.company.com/api/xxv/abc/feature
对于staging和online不同的环境,将请求转发到不同的server即可。
请求转发
http://admin-test.company.com/api/abc/feature
->
http://ttt.company.com/api/xxv/abc/feature
ngin配置
1 2 3 4 5 6 7 8 9 10 11 12
| server { listen 80; server_name admin-test.company.com;
location /api/abc { rewrite /api/abc/(.*) /api/xxv/$1 break; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://staging.server.hostname:8080; } }
|
1 2 3 4 5 6 7 8 9 10 11 12
| server { listen 80; server_name admin.company.com;
location /api/abc { rewrite /api/abc/(.*) /api/xxv/$1 break; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://myserver-write-nodes; } }
|
服务端处理跨域请求
在返回的response header中加入允许跨域访问的属性。例如:
Access-Control-Allow-Origin: {允许的域名}
更多信息参考:跨域 HTTP 请求(Cross-site HTTP request)