跨域解決方案(史上最易懂)

跨域總結

1.跨域思路

跨域解決方案通常分爲兩種:前端解決,後端解決javascript

1.1 前端解決方案

經過前端解決的思想就是,經過設置中間件把跨域的請求轉發一下,其實就是反向代理,
好比 http://1.2.3.4:8099 想要訪問豆瓣的接口 http://www.douban.com/v?a=1很...
會有跨域問題,可是若是請求的是http://1.2.3.4:8099/api/v?a=1 就不存在跨域html

反向代理就是截取 /api 以後的請求 轉發到http://www.douban.com/ 服務器上前端

  1. vue react等項目 可使用 http-proxy-middleware
  2. 普通項目 就是如下介紹的 本地安裝nginx 反向代理跨域

1.2 後端解決方案

後端解決方案,通常是須要後端參與vue

  1. jsonp 回調函數
  2. CORS 須要後端加頭部 但並非全部瀏覽器都支持

2.本地配置nginx解決跨域

2.1 mac/vmware/設置共享文件

  1. 在虛擬機上找到設置,選擇共享文件夾
  2. mac vmware想使用共享文件必須安裝vmware-tools

    2.1 在虛擬機關閉狀態下,選擇虛擬機,安裝vmware-tools
    2.2 在ubuntu中直接使用 apt 安裝 以後會介紹java

  3. 安裝vmware-tools以後查看 mnt文件下是否有hgfs文件

    3.1 有hgfs說明已經有共享文件的掛載點
    3.2 若是沒有hgfs文件 說明安裝的vm-tools可能和ubuntu版本有衝突react

  4. 設置共享目錄
# 查看當前設置的共享文件
#sudo vmware-hgfsclient

# 上述命令可能因爲沒有安裝包報錯,因此先安裝一下包
# apt-get install open-vm-tools
# apt-get install open-vm-tools-desktop
# apt-get install open-vm-tools-dkms

# 本身手動建立hgfs並掛載
# mkdir /mnt/hgfs
# vmhgfs-fuse .host:/ /mnt/hgfs

# 使用文件查看是否有權限進入 /mnt/hgfs 若是沒有使用一下命令
# sudo vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other -o nonempty

# 每次進入系統都須要本身mount 能夠配置/etc/fstab

.host:/    /mnt/hgfs       vmhgfs     defaults  0  0

完成以上步驟,你會發現 /mnt/hgfs/XXX XX 爲你設置的共享目錄jquery

2.2 配置nginx

2.2.1 修改nginx默認服務器根目錄

修改配置文件位置:vim /etc/nginx/sites-available/defaultnginx

location / {
    # 配置共享文件的位置
    root /mnt/hgfs/ftp;

    # First attempt to serve request as file, then
    # as directory, then fall back to displaying a 404.
    try_files $uri $uri/ =404;
}

2.2.2 訪問http://XXX 查看配置是否生效(403錯誤)

403錯誤可能有兩種狀況,不要誤覺得真的沒有權限ajax

  1. 配置的共享文件下是否有indx.html,沒有的話會報錯403 Forbidden
  2. 真的沒有權限 須要修改一下配置 chrod 修改權限

解決Nginx出現403 forbiddenjson

至關良心的解決方案

2.2.3 配置反向代理

我用的豆瓣隨便的一個接口來測試的

location /api{
    # 重寫
    rewrite  ^.+api/?(.*)$ /$1 break;
    # 配置代理
    proxy_pass   https://api.douban.com;
}

2.3 測試跨域

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <script src="jquery.js"></script>
    <title>Title</title>
</head>
<body>
<div>
    <button id="btn1">測試跨域</button>
    <div id="content"></div>
</div>
<script type="text/javascript">
    $(document).ready(function () {
        $("#btn1").click(function () {
            // 全部豆瓣請求都以 /api 開始  注意相對絕對路徑
            $.get("/api/v2/book/1220562", function (data, status) {
                alert("數據: " + JSON.stringify(data) + "\n狀態: " + status);
                $("#content").html(JSON.stringify(data))
            });
        });
    });
</script>
</body>
</html>

2.4 瀏覽器測試跨域,跨域成功

跨域總結

1.跨域思路

跨域解決方案通常分爲兩種:前端解決,後端解決

1.1 前端解決方案

經過前端解決的思想就是,經過設置中間件把跨域的請求轉發一下,其實就是反向代理,
好比 http://1.2.3.4:8099 想要訪問豆瓣的接口 http://www.douban.com/v?a=1很...
會有跨域問題,可是若是請求的是http://1.2.3.4:8099/api/v?a=1 就不存在跨域

反向代理就是截取 /api 以後的請求 轉發到http://www.douban.com/ 服務器上

  1. vue react等項目 可使用 http-proxy-middleware
  2. 普通項目 就是如下介紹的 本地安裝nginx 反向代理跨域

1.2 後端解決方案

後端解決方案,通常是須要後端參與

  1. jsonp 回調函數
  2. CORS 須要後端加頭部 但並非全部瀏覽器都支持

2.本地配置nginx解決跨域

2.1 mac/vmware/設置共享文件

  1. 在虛擬機上找到設置,選擇共享文件夾
  2. mac vmware想使用共享文件必須安裝vmware-tools

    2.1 在虛擬機關閉狀態下,選擇虛擬機,安裝vmware-tools
    2.2 在ubuntu中直接使用 apt 安裝 以後會介紹

  3. 安裝vmware-tools以後查看 mnt文件下是否有hgfs文件

    3.1 有hgfs說明已經有共享文件的掛載點
    3.2 若是沒有hgfs文件 說明安裝的vm-tools可能和ubuntu版本有衝突

  4. 設置共享目錄
# 查看當前設置的共享文件
#sudo vmware-hgfsclient

# 上述命令可能因爲沒有安裝包報錯,因此先安裝一下包
# apt-get install open-vm-tools
# apt-get install open-vm-tools-desktop
# apt-get install open-vm-tools-dkms

# 本身手動建立hgfs並掛載
# mkdir /mnt/hgfs
# vmhgfs-fuse .host:/ /mnt/hgfs

# 使用文件查看是否有權限進入 /mnt/hgfs 若是沒有使用一下命令
# sudo vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other -o nonempty

# 每次進入系統都須要本身mount 能夠配置/etc/fstab

.host:/    /mnt/hgfs       vmhgfs     defaults  0  0

完成以上步驟,你會發現 /mnt/hgfs/XXX XX 爲你設置的共享目錄

2.2 配置nginx

2.2.1 修改nginx默認服務器根目錄

修改配置文件位置:vim /etc/nginx/sites-available/default

location / {
    # 配置共享文件的位置
    root /mnt/hgfs/ftp;

    # First attempt to serve request as file, then
    # as directory, then fall back to displaying a 404.
    try_files $uri $uri/ =404;
}

2.2.2 訪問http://XXX 查看配置是否生效(403錯誤)

403錯誤可能有兩種狀況,不要誤覺得真的沒有權限

  1. 配置的共享文件下是否有indx.html,沒有的話會報錯403 Forbidden
  2. 真的沒有權限 須要修改一下配置 chrod 修改權限

解決Nginx出現403 forbidden

至關良心的解決方案

2.2.3 配置反向代理

我用的豆瓣隨便的一個接口來測試的

location /api{
    # 重寫
    rewrite  ^.+api/?(.*)$ /$1 break;
    # 配置代理
    proxy_pass   https://api.douban.com;
}

2.3 測試跨域

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <script src="jquery.js"></script>
    <title>Title</title>
</head>
<body>
<div>
    <button id="btn1">測試跨域</button>
    <div id="content"></div>
</div>
<script type="text/javascript">
    $(document).ready(function () {
        $("#btn1").click(function () {
            // 全部豆瓣請求都以 /api 開始  注意相對絕對路徑
            $.get("/api/v2/book/1220562", function (data, status) {
                alert("數據: " + JSON.stringify(data) + "\n狀態: " + status);
                $("#content").html(JSON.stringify(data))
            });
        });
    });
</script>
</body>
</html>

2.4 瀏覽器測試跨域,跨域成功

Snip20180805_2.png
clipboard.png
Snip20180805_3.png
clipboard.png
Snip20180805_4.png
clipboard.png
Snip20180805_5.png
clipboard.png
Snip20180805_6.png
clipboard.png
Snip20180805_7.png
clipboard.png

參考

  1. 安裝vmtools以後在/mnt目錄下沒有hgfs文件夾
  2. vmware設置共享文件夾
  3. 虛擬機找不到/mnt/hgfs掛載目錄
相關文章
相關標籤/搜索