nginx解決跨域問題

一. 產(chǎn)生跨域的原因

1.瀏覽器限制

2.跨域

3.XHR(XMLHttpRequest)請求

二. 解決思路

解決跨域有多重括袒,在這里主要講用nginx解決跨域

1.JSONP

2.nginx代理

3.瀏覽器禁止檢查跨域

三. 下載安裝nginx

  • 選擇其中一個版本下載列肢,再解壓即可使用
  • 在nginx目錄下輸入nginx -v顺献,若出現(xiàn)版本號壤蚜,則安裝成功
nginx解決跨域問題

四. nginx反向代理解決跨域(客戶端解決跨域)

1.我們使用jquery的ajax發(fā)送請求,node開啟后臺服務(wù)

前端代碼:

利用jQuery的ajax api發(fā)送請求

 <button id="getOK">發(fā)送請求OK(客戶端解決跨域問題)</button>
 <button id="getNO">發(fā)送請求NO(客戶端解決跨域問題)</button>
 <script>
 $(document).ready(function () {
 $('#getOK').click(function () {
 $.ajax({
 url:'http://localhost:3000/ok',
 success:function(res) {
 console.log("success",res)
 },
 error:function(err) {
 console.log('fail',err)
 }
 })
 })
 $('#getNO').click(function () {
 $.ajax({
 url:'http://localhost:3000/no',
 success:function(res) {
 console.log("success",res)
 },
 error:function(err) {
 console.log('fail',err)
 }
 })
 })
 }) 
 </script>

后端代碼:

利用node的express框架開啟服務(wù)肛响,并根據(jù)url返回json格式的數(shù)據(jù),

設(shè)置這么多接口的目的是為了后面匹配nginx的location配置的

const express = require('express')
const cookieParser = require('cookie-parser')
var app = express()
var router = express.Router()
router.get('/ok',function (req,res) {
 res.json({
 code:200,
 msg:"isOK"
 }) 
})
router.get('/ok/son',function (req,res) {
 res.json({
 code:200,
 msg:"isOKSon"
 }) 
})
router.get('/ok2',function (req,res) {
 res.json({
 code:200,
 msg:"isOK2"
 }) 
})
router.get('/no',function (req,res) {
 res.json({
 code:200,
 msg:"isNO"
 }) 
})
router.get('/no/son',function (req,res) {
 res.json({
 code:200,
 msg:"isNOSON"
 }) 
})
router.get('/no/son2',function (req,res) {
 res.json({
 code:200,
 msg:"isNOSON2"
 }) 
})
app.use(router)
app.use(cookieParser)
app.listen(3000,function () {
 console.log('listen in 3000')
})

然后開啟node服務(wù)

nginx解決跨域問題

現(xiàn)在可以測試下接口

nginx解決跨域問題

可以看出郭膛,node服務(wù)成功開啟

現(xiàn)在可以嘗試不開啟nginx服務(wù)直接發(fā)送ajax請求會出現(xiàn)什么情況

(注意:發(fā)送ajax請求需要以服務(wù)器方式打開網(wǎng)頁闪檬,不能以文件形式)

nginx解決跨域問題

如圖星著,在5500端口請求3000端口出現(xiàn)了跨域問題,這時候就可以開啟nginx服務(wù)并配置location進行解決

2.配置nginx進行反向代理解決跨域

反向代理的原理就是講前端的地址和后端的地址用nginx轉(zhuǎn)發(fā)到同一個地址下粗悯,如5500端口和3000端口都轉(zhuǎn)到3003端口下虚循,具體配置如下:

  • 打開nginx目錄下的conf目錄里面nginx.conf
  • 為了方便以后測試,我們將配置分離開來样傍,弄成多個文件
  • 在nginx.conf的http對象的最后加上include ../vhost/test.conf;(注意要最后加上分號)
  • 這樣就可以在test.conf下單獨配置了

具體的location配置規(guī)則如下:

server
{
 listen 3003;
 server_name localhost;
 ## = /表示精確匹配路徑為/的url横缔,真實訪問為http://localhost:5500
 location = / {
 proxy_pass http://localhost:5500;
 }
 ## /no 表示以/no開頭的url,包括/no1,no/son衫哥,或者no/son/grandson
 ## 真實訪問為http://localhost:5500/no開頭的url
 ## 若 proxy_pass最后為/ 如http://localhost:3000/;匹配/no/son茎刚,則真實匹配為http://localhost:3000/son
 location /no {
 proxy_pass http://localhost:3000;
 }
 ## /ok/表示精確匹配以ok開頭的url,/ok2是匹配不到的撤逢,/ok/son則可以
 location /ok/ {
 proxy_pass http://localhost:3000;
 }
}

上面代碼的意思是將localhost:3003轉(zhuǎn)發(fā)為location:5500,也就是說現(xiàn)在訪問localhost:3003實際上是訪問location:5500,而訪問localhost:3003/no則是訪問localhost:3000,并以no開頭的url

  • 現(xiàn)在我們可以開啟nginx服務(wù)了膛锭,在nginx目錄下使用start nginx即可開啟服務(wù)
nginx解決跨域問題
  • 每次修改配置都需要執(zhí)行nginx -s reload命令才能生效
nginx解決跨域問題

現(xiàn)在修改前端代碼,將之前請求的接口的端口換為3003蚊荣,如下:

$('#getOK').click(function () {
 $.ajax({
 url:'http://localhost:3003/ok',
 success:function(res) {
 console.log("success",res)
 },
 error:function(err) {
 console.log('fail',err)
 }
 })
 })

在瀏覽器訪問的也不算location:5500,而是localhost:3003了初狰,再次發(fā)送請求也不會出現(xiàn)跨域問題了,因為他們都是同一個域了互例,這就是nginx反向代理

nginx解決跨域問題

五. 后端配置nginx解決跨域(服務(wù)端解決跨域)

1. 依舊是ajax+node

這是前端代碼

$(document).ready(function () {
 $('#get').click(function () {
 $.ajax({
 url:'http://localhost:3002/ok',
 // 帶cookies的請求
 xhrFields:{
 withCredentials:true
 },
 success:function(res) {
 console.log("success",res)
 },
 error:function(err) {
 console.log('fail',err)
 }
 })
 })
 })

后端代碼同前面

還有nginx配置如下:

server
{
 listen 3002;
 server_name localhost;
 location /ok {
 proxy_pass http://localhost:3000;
 # 指定允許跨域的方法奢入,*代表所有
 add_header Access-Control-Allow-Methods *;
 # 預(yù)檢命令的緩存,如果不緩存每次會發(fā)送兩次請求
 add_header Access-Control-Max-Age 3600;
 # 帶cookie請求需要加上這個字段敲霍,并設(shè)置為true
 add_header Access-Control-Allow-Credentials true;
 # 表示允許這個域跨域調(diào)用(客戶端發(fā)送請求的域名和端口) 
 # $http_origin動態(tài)獲取請求客戶端請求的域 不用*的原因是帶cookie的請求不支持*號
 add_header Access-Control-Allow-Origin $http_origin;
 # 表示請求頭的字段 動態(tài)獲取
 add_header Access-Control-Allow-Headers 
 $http_access_control_request_headers;
 # OPTIONS預(yù)檢命令俊马,預(yù)檢命令通過時才發(fā)送請求
 # 檢查請求的類型是不是預(yù)檢命令
 if ($request_method = OPTIONS){
 return 200;
 }
 }
}

發(fā)送預(yù)檢命令的是非簡單請求丁存,具體可以看慕課網(wǎng)ajax跨域完全講解

實際上不是非簡單請求的且不帶cookie只需2個字段即可解決跨域

add_header Access-Control-Allow-Methods *;

add_header Access-Control-Allow-Origin $http_origin;

  • 具體效果如下圖:
nginx解決跨域問題

這時只需改ajax請求的端口接口肩杈,無需修改前端服務(wù)器的地址

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市解寝,隨后出現(xiàn)的幾起案子扩然,更是在濱河造成了極大的恐慌,老刑警劉巖聋伦,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件夫偶,死亡現(xiàn)場離奇詭異界睁,居然都是意外死亡,警方通過查閱死者的電腦和手機兵拢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門翻斟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人说铃,你說我怎么就攤上這事访惜。” “怎么了腻扇?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵债热,是天一觀的道長。 經(jīng)常有香客問我幼苛,道長窒篱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任舶沿,我火速辦了婚禮墙杯,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘括荡。我一直安慰自己霍转,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布一汽。 她就那樣靜靜地躺著避消,像睡著了一般。 火紅的嫁衣襯著肌膚如雪召夹。 梳的紋絲不亂的頭發(fā)上岩喷,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天,我揣著相機與錄音监憎,去河邊找鬼纱意。 笑死,一個胖子當(dāng)著我的面吹牛鲸阔,可吹牛的內(nèi)容都是我干的偷霉。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼褐筛,長吁一口氣:“原來是場噩夢啊……” “哼类少!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起渔扎,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤硫狞,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體残吩,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡财忽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了泣侮。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片即彪。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖活尊,靈堂內(nèi)的尸體忽然破棺而出祖凫,到底是詐尸還是另有隱情,我是刑警寧澤酬凳,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布惠况,位于F島的核電站,受9級特大地震影響宁仔,放射性物質(zhì)發(fā)生泄漏稠屠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一翎苫、第九天 我趴在偏房一處隱蔽的房頂上張望权埠。 院中可真熱鬧,春花似錦煎谍、人聲如沸攘蔽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽满俗。三九已至,卻和暖如春作岖,著一層夾襖步出監(jiān)牢的瞬間唆垃,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工痘儡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留辕万,地道東北人。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓沉删,卻偏偏與公主長得像渐尿,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子矾瑰,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 準(zhǔn)備nginx 下載nginx 去nginx官網(wǎng)下載最新版nginx.目前(2017年11月13日)最新版是1.1...
    昵稱已被使用_閱讀 8,087評論 4 12
  • 學(xué)習(xí)完整課程請移步 互聯(lián)網(wǎng) Java 全棧工程師 本節(jié)視頻 【視頻】Dubbo 實現(xiàn)微服務(wù)架構(gòu)-使用 Nginx ...
    擼帝閱讀 4,990評論 0 24
  • 1.跨域解釋 1.1 怎么知道我遇到了跨域問題 如果項目沒做前后端分離砖茸,是不會有跨域問題的。前后端分離的項目中脯倚,前...
    貓尾草閱讀 26,295評論 0 10
  • 在大家做前端開發(fā)的過程中遇到前后臺分離的項目時渔彰,在前端向后臺請求接口的時候嵌屎,多一半會遇到跨域這個問題推正,原來的...
    愛焰閱讀 884評論 0 0
  • 什么是nginx? Nginx (engine x) 是一款輕量級的Web 服務(wù)器 恍涂、反向代理服務(wù)器及電子郵件(I...
    花開_陳鳳娟閱讀 772評論 0 1