nginx用反向代理機制解決跨域的問題

什麼是跨域?

使用js獲取數據時,涉及到的兩個url只要協議、域名、端口有任何一個不同,都被當作是不同的域,相互訪問就會有跨域問題。

跨域,指的是瀏覽器不能執行其他網站的腳本。它是由瀏覽器的同源策略造成的,是瀏覽器施加的安全限制。

所謂同源是指,域名,協議,端口均相同,不明白沒關係,舉個栗子:

http://www.123.com/index.html 調用 http://www.123.com/server.php (非跨域)

http://www.123.com/index.html 調用 http://www.456.com/server.php (主域名不同:123/456,跨域)

http://abc.123.com/index.html 調用 http://def.123.com/server.php (子域名不同:abc/def,跨域)

http://www.123.com:8080/index.html 調用 http://www.123.com:8081/server.php (端口不同:8080/8081,跨域)

http://www.123.com/index.html 調用 https://www.123.com/server.php (協議不同:http/https,跨域)

請注意:localhost和127.0.0.1雖然都指向本機,但也屬於跨域。

瀏覽器執行javascript腳本時,會檢查這個腳本屬於哪個頁面,如果不是同源頁面,就不會被執行。

背景

大家看了上面的跨域介紹,相信都大致瞭解所謂的跨域訪問。正好我們公司這兩天就有這種需求,公司前端工程師提出需要跨域訪問,需求如下:

nginx服務器:172.18.18.75

h5服務器:172.18.18.76

java服務器:172.18.18.77

新增加域名:www.oilup.com  指向 nginx服務器(172.18.18.75)

域名指向的靜態目錄:/usr/local/nginx/html/web/ 目錄放在nginx服務器(172.18.18.75)

[root@localhost web]# pwd

/usr/local/nginx/html/web

[root@localhost web]# ls

css          handlebars  images      init.html  package.json  README.md

gulpfile.js  html        index.html  js         pc.zip        template


當訪問域名http://www.oilup.com/  調用  http://172.18.18.76:7080

當訪問域名http://www.oilup.com/  調用  http://172.18.18.77:8888

如何解決

進入nginx服務器,配置nginx.conf:

#vim /usr/local/nginx/conf/nginx.conf

http {

    include       mime.types;

    default_type  application/octet-stream;

    sendfile        on;

    #增加下面3行

    add_header Access-Control-Allow-Origin *;

    add_header Access-Control-Allow-Headers X-Requested-With;

    add_header Access-Control-Allow-Methods GET,POST,OPTIONS;

    ......

    其它http項的配置省略


    

    #配置server,用location匹配並反向代理proxy_pass

    server {

        listen       80;

        server_name  www.oilup.com;

        

        location / {

           root   html/web;                   

          index  index.html index.htm;

        }

        

        location  /h5/ {                

          rewrite  ^.+h5/?(.*)$ /$1 break; 

          include  uwsgi_params;

          proxy_pass   http://172.18.18.76:7080;

        }

        

        location  /javaes/ {

          rewrite  ^.+javaes/?(.*)$ /$1 break;

          include  uwsgi_params;

          proxy_pass   http://172.18.18.77:8888;

        }

}


重啓nginx服務:

/usr/local/nginx/sbin/nginx -s reload


測試訪問

image.png


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章