節(jié)選自:https://segmentfault.com/a/1190000010197683,親測有效
項目前后端分離后,前后端項目分開開發(fā),尤其是單頁面應用,前端代碼會開啟單獨的服務器,若直接在前端項目中訪問后端API,肯定會遇到因跨域不能訪問的問題。
這時候,用nginx反向代理實現(xiàn)跨域,是最簡單的跨域方式。只需要修改nginx的配置即可解決跨域問題,支持所有瀏覽器,支持session,不需要修改任何代碼,并且不會影響服務器性能。
只需要配置nginx,在一個服務器上配置多個前綴來轉(zhuǎn)發(fā)http/https請求到多個真實的服務器即可。這樣,這個服務器上所有url都是相同的域名、協(xié)議和端口。因此,對于瀏覽器來說,這些url都是同源的,沒有跨域限制。而實際上,這些url實際上由物理服務器提供服務。
環(huán)境:CentOS 7,? nginx/1.12.2
修改nginx 配置文件:/etc/nginx/nginx.conf, 添加以項選項
location / {
? ? proxy_pass http://192.168.1.10:8080/;??????? # 前端服務器地址
}
location /api/ {
??? # 所有對后端的請求加一個 api 前綴方便區(qū)分,真正訪問的時候移除這個前綴
? ? rewrite ^/api/(.*)$ /$1 break;????????????????????????
# 將真正的請求代理到真實的服務器地址,如 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ā)到真正的后端服務器,
因為前后端域名一樣,所以瀏覽器不會有跨域問題
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