節(jié)選自:https://segmentfault.com/a/1190000010197683,親測有效
項(xiàng)目前后端分離后,前后端項(xiàng)目分開開發(fā),尤其是單頁面應(yīng)用,前端代碼會開啟單獨(dú)的服務(wù)器,若直接在前端項(xiàng)目中訪問后端API,肯定會遇到因跨域不能訪問的問題。
這時(shí)候,用nginx反向代理實(shí)現(xiàn)跨域,是最簡單的跨域方式。只需要修改nginx的配置即可解決跨域問題,支持所有瀏覽器,支持session,不需要修改任何代碼,并且不會影響服務(wù)器性能。
只需要配置nginx,在一個(gè)服務(wù)器上配置多個(gè)前綴來轉(zhuǎn)發(fā)http/https請求到多個(gè)真實(shí)的服務(wù)器即可。這樣,這個(gè)服務(wù)器上所有url都是相同的域名、協(xié)議和端口。因此,對于瀏覽器來說,這些url都是同源的,沒有跨域限制。而實(shí)際上,這些url實(shí)際上由物理服務(wù)器提供服務(wù)。
環(huán)境:CentOS 7,? nginx/1.12.2
修改nginx 配置文件:/etc/nginx/nginx.conf, 添加以項(xiàng)選項(xiàng)
location / {
? ? proxy_pass http://192.168.1.10:8080/;??????? # 前端服務(wù)器地址
}
location /api/ {
??? # 所有對后端的請求加一個(gè) api 前綴方便區(qū)分,真正訪問的時(shí)候移除這個(gè)前綴
? ? rewrite ^/api/(.*)$ /$1 break;????????????????????????
# 將真正的請求代理到真實(shí)的服務(wù)器地址,如 ajax 的 url 為 /api/user/1 的請求被轉(zhuǎn)發(fā)到http://www.serverA.com/user/1
? ? proxy_pass http://localhost:8080;??????????????
}
現(xiàn)在瀏覽器通過訪問 nginx 地址即可打開前端頁面,前端所有對后臺接口的請求都會通過 nginx 轉(zhuǎn)發(fā)到真正的后端服務(wù)器,
因?yàn)榍昂蠖擞蛎粯樱詾g覽器不會有跨域問題
2. nginx 代理websocket配置:
$ vim /usr/local/nginx/conf/nginx.conf
# 在http上下文中增加如下配置,確保Nginx能處理正常http請求。
location /ws {
proxy_pass http://192.168.1.117:8080/ws;
proxy_read_timeout 300s;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade; p
roxy_set_header Connection "Upgrade";
}
111