Nginx跨域問題解析與解決
什么是跨域
- 域: 是指瀏覽器不能執(zhí)行其他網(wǎng)站的腳本
- 跨域: 它是由瀏覽器的 同源策略 造成的,是瀏覽器對(duì)
JavaScript
實(shí)施的安全限制,所謂同源(即指在同一個(gè)域)就是兩個(gè)頁(yè)面具有相同的協(xié)議protocol
,主機(jī)host
和端口號(hào)port
則就會(huì)造成 跨域
跨域場(chǎng)景
場(chǎng)景的跨域場(chǎng)景有哪些,請(qǐng)參考下表
當(dāng)前url | 請(qǐng)求url | 是否跨域 | 原因 |
---|---|---|---|
http://www.autofelix.cn | http://www.autofelix.cn/api.php | 否 | 協(xié)議/域名/端口都相同 |
http://www.autofelix.cn | https://www.autofelix.cn/api.php | 是 | 協(xié)議不同 |
http://www.autofelix.cn | http://www.rabbit.cn | 是 | 主域名不同 |
http://www.autofelix.cn | http://api.autofelix.cn | 是 | 子域名不同 |
http://www.autofelix.cn:80 | http://www.autofelix.cn:8080 | 是 | 端口不同 |
解決跨域的四種方式
- nginx的反向代理
- 使用
nginx
反向代理實(shí)現(xiàn)跨域,是最簡(jiǎn)單的跨域方式 - 只需要修改
nginx
的配置即可解決跨域問題,支持所有瀏覽器,支持session
,不需要修改任何代碼,并且不會(huì)影響服務(wù)器性能
// nginx配置 server { listen 81; server_name www.domain1.com; location / { proxy_pass http://www.domain2.com:8080; #反向代理 proxy_cookie_domain www.domain2.com www.domain1.com; #修改cookie里域名 index index.html index.htm; # 當(dāng)用webpack-dev-server等中間件代理接口訪問nignx時(shí),此時(shí)無(wú)瀏覽器參與,故沒有同源限制,下面的跨域配置可不啟用 add_header Access-Control-Allow-Origin http://www.domain1.com; #當(dāng)前端只跨域不帶cookie時(shí),可為* add_header Access-Control-Allow-Credentials true; } }
jsonp請(qǐng)求
jsonp
是服務(wù)器與客戶端跨源通信的常用方法。最大特點(diǎn)就是簡(jiǎn)單適用,兼容性好兼容低版本IE
,缺點(diǎn)是只支持get
請(qǐng)求,不支持post
請(qǐng)求- 原理時(shí)網(wǎng)頁(yè)通過添加一個(gè)
<script>
元素,向服務(wù)器請(qǐng)求json
數(shù)據(jù),服務(wù)器收到請(qǐng)求后,將數(shù)據(jù)放在一個(gè)指定名字的回調(diào)函數(shù)的參數(shù)位置傳回來(lái)
//jquery實(shí)現(xiàn) <script> $.getJSON('http://autofelix.com/api.php&callback=?', function(res) { // 處理獲得的數(shù)據(jù) console.log(res) }); </script>
- 后端語(yǔ)言代理
- 可以通過一種沒有跨域限制的語(yǔ)言中轉(zhuǎn)一下,通過后端語(yǔ)言去請(qǐng)求資源,然后再返回?cái)?shù)據(jù)
- 比如
http://www.autofelix.cn
需要調(diào)用http://api.autofelix.cn/userinfo
去獲取用戶數(shù)據(jù),因?yàn)樽佑蛎煌?,?huì)有跨域限制 - 可以先請(qǐng)求
http://www.autofelix.cn
下的php
文件,比如http://www.autofelix.cn/api.php
,然后再通過該php
文件返回?cái)?shù)據(jù)
// api.php 文件中的代碼 public function getCurl($url, $timeout = 5) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); $result = curl_exec($ch); curl_close($ch); return $result; } $result = getCurl('http://api.autofelix.cn/userinfo'); return $result;
- 后端語(yǔ)言的設(shè)置
- 主要通過后端語(yǔ)言主動(dòng)設(shè)置跨域請(qǐng)求,這里以
php
作為案例
// 允許所有域名訪問 header('Access-Control-Allow-Origin: *'); // 允許單個(gè)域名訪問 header('Access-Control-Allow-Origin: https://autofelix.com'); // 允許多個(gè)自定義域名訪問 static public $originarr = [ 'https://autofelix.com', 'https://baidu.com', 'https://csdn.net', ]; // 獲取當(dāng)前跨域域名 $origin = isset($_SERVER['HTTP_ORIGIN']) ? $_SERVER['HTTP_ORIGIN'] : ''; if (in_array($origin, self::$originarr)) { // 允許 $originarr 數(shù)組內(nèi)的 域名跨域訪問 header('Access-Control-Allow-Origin:' . $origin); // 響應(yīng)類型 header('Access-Control-Allow-Methods:POST,GET'); // 帶 cookie 的跨域訪問 header('Access-Control-Allow-Credentials: true'); // 響應(yīng)頭設(shè)置 header('Access-Control-Allow-Headers:x-requested-with,Content-Type,X-CSRF-Token'); }
到此這篇關(guān)于Nginx跨域問題解析與解決的文章就介紹到這了,更多相關(guān)Nginx跨域內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Nginx報(bào):Nginx?-?504?Gateway?Time-out問題解決辦法
這篇文章主要給大家介紹了關(guān)于Nginx報(bào):Nginx?-?504?Gateway?Time-out問題的解決辦法,一般是由于程序執(zhí)行時(shí)間過長(zhǎng)導(dǎo)致響應(yīng)超時(shí),例如程序需要執(zhí)行90秒,而nginx最大響應(yīng)等待時(shí)間為30秒,這樣就會(huì)出現(xiàn)超時(shí),需要的朋友可以參考下2024-01-01LNMPA遇到504 Gateway time-out錯(cuò)誤的解決方法
這篇文章主要介紹了LNMPA遇到504 Gateway time-out錯(cuò)誤的解決方法,需要的朋友可以參考下2017-07-07nginx+lua單機(jī)上萬(wàn)并發(fā)的實(shí)現(xiàn)
nginx是我們最常用的服務(wù)器,常用于做內(nèi)容分發(fā)和反向代理,本文主要介紹了nginx+lua單機(jī)上萬(wàn)并發(fā)的實(shí)現(xiàn),有興趣的可以了解下2021-05-05關(guān)于Nginx中虛擬主機(jī)的一些冷門知識(shí)小結(jié)
這篇文章主要給大家介紹了關(guān)于Nginx中虛擬主機(jī)的一些冷門知識(shí),文中通過圖文以及實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-03-03Nginx Rewrite規(guī)則與使用介紹和技巧實(shí)例
這篇文章主要介紹了Nginx Rewrite規(guī)則與使用介紹和技巧實(shí)例,本文講解了正則表達(dá)式匹配、文件及目錄匹配、flag標(biāo)記、Nginx Rewrite相關(guān)指令等內(nèi)容,需要的朋友可以參考下2015-01-01Nginx 出現(xiàn) 403 Forbidden 最終解決方法
這篇文章給大家介紹了Nginx 出現(xiàn) 403 Forbidden 最終解決方法,下面分步驟給大家介紹的非常詳細(xì),感興趣的的朋友一起看看吧2017-08-08Nginx圖片服務(wù)器配置之后圖片訪問404的問題解決
本文主要介紹了Nginx圖片服務(wù)器配置之后圖片訪問404的問題解決,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03