成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Nginx緩存引發(fā)的跨域慘案

開發(fā) 前端
如果不涉及跨域,混用 http/https協(xié)議 + nginx緩存,其實也是沒有問題的。但是一旦出現(xiàn)了跨域使用,必須 在nginx 緩存配置中,配置 scheme + host + uri + 參數(shù)。

1. 前言

貴金屬wap版直播間上線后,偶爾有用戶反饋,在進入wap直播間的時候,出現(xiàn)空白頁面,但是重新刷新又可以正常顯示了。我們曾一度認(rèn)為是網(wǎng)絡(luò)請求異常或兼容問題,直到開發(fā)PC版直播間,在進行調(diào)試中,同樣遇到了“白屏”問題,才引起了足夠重視,并進行了問題跟蹤與分析。現(xiàn)在跟大家分享一下,這種偶然現(xiàn)象出現(xiàn)的原因。

我們的直播間落地頁在fa.163.com 系統(tǒng),而直播間內(nèi)容,是通過 向直播間系統(tǒng) qz.fa.163.com 發(fā)起Ajax請求獲取的。在出現(xiàn)“白屏”的時候,可以通過瀏覽器的調(diào)試窗口,可以看到出現(xiàn)下面的報錯

 

2. 問題分析

從上述錯誤提示文案中可以看到,問題首先和 跨域 有關(guān)。

何為跨域

從字面上理解為“跨域名”,瀏覽器不能執(zhí)行其他網(wǎng)站的腳本,然而,跨域不僅僅局限于域名這一項。只要協(xié)議、域名、端口有任何一個不同,都被當(dāng)作是不同的域。 這是由于>同源策略的限制,從一個域上加載的腳本不允許訪問另外一個域的文檔屬性。雖然在瀏覽器中,<script>、<img>、<iframe>、<link>等標(biāo)簽都>可>以加載跨域資源,而不受同源限制,但瀏覽器會限制腳本中發(fā)起的跨域請求。比如,使用 XMLHttpRequest 對象和Fetch發(fā)起 HTTP 請求就必須遵守同源策略。

同源策略/SOP(Same origin policy)是一種約定,它是瀏覽器最核心也最基本的安全功能,如果缺少了同源策略,瀏覽器很容易受到XSS、CSFR等攻擊。SOP要求兩個通訊地址的協(xié)議、域名、端口號必須相同,否則兩個地址的通訊將被瀏覽器視為不安全的,并被block下來。

舉個例子:從貴金屬主站 http://fa.163.com 發(fā)起請求訪問以下url:

 

解決跨域

在實際應(yīng)用中有多種方式來解決跨域問題,相信在實踐中都會用到其中的某些方案:

(1).JSONP (無狀態(tài)連接,不能獲悉連接狀態(tài)和錯誤事件,而且只能走GET的形式)

(2).iframe形式

(3).服務(wù)器代理

頁面直接向同域的服務(wù)端發(fā)請求,服務(wù)端進行跨域處理或爬蟲后,再把數(shù)據(jù)返回給客戶端頁。

(4).CORS

CORS(Cross-Origin Resource Sharing)跨域資源共享,定義了必須在訪問跨域資源時,瀏覽器與服務(wù)器應(yīng)該如何溝通。CORS背后的基本思想就>是使用自定義的HTTP頭部讓瀏覽器與服務(wù)器進行溝通,從而決定請求或響應(yīng)是應(yīng)該成功還是失敗。目前,所有瀏覽器都支持該功能,IE瀏覽器不能低>于IE10。整個CORS通信過程,都是瀏覽器自動完成,不需要用戶參與。對于開發(fā)者來說,CORS通信與同源的AJAX通信沒有差別,代碼完全一樣。瀏>覽器一旦發(fā)現(xiàn)AJAX請求跨源,就會自動添加一些附加的頭信息,有時還會多出一次附加的請求,但用戶不會有感覺。

CORS方式實現(xiàn):

瀏覽器在發(fā)出CORS請求時會在頭信息之中增加一個Origin字段;后端返回代碼中增加三個字段

  1. header(“Access-Control-Allow-Origin”:“”);           // 必選 允許所有來源訪問 
  2.  
  3. header(“Access-Control-Allow-Credentials”:“true”);  //可選 是否允許發(fā)送cookie 
  4.  
  5. header(“Access-Control-Allow-Method”:“POST,GET”);   //可選 允許訪問的方式  

nginx是一個高性能的web服務(wù)器,常用作反向代理服務(wù)器。nginx作為反向代理服務(wù)器,就是把http請求轉(zhuǎn)發(fā)到另一個或者一些服務(wù)器上。通過把本地一個url前綴映射到要跨域訪問的web服務(wù)器上,就可以。

為了解決跨域問題,我們選擇方案d , 在直播間的過濾器中,統(tǒng)一添加了如下代碼:

  1. <a href='http://www.jobbole.com/members/wx610506454'>@Override</a> 
  2.  
  3. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 
  4.  
  5.  // 加入響應(yīng)頭 
  6.  
  7.  String origin = request.getHeader("Origin"); 
  8.  
  9.  if("http://fa.163.com".equals(origin) || "https://fa.163.com".equals(origin) ) { 
  10.  
  11.      response.addHeader("Access-Control-Allow-Origin", origin); 
  12.  
  13.      response.addHeader("Access-Control-Allow-Credentials""true"); 
  14.  
  15.  } 
  16.  
  17.  return true 

從錯誤提示文案中,我們還可以看到錯誤提示的關(guān)鍵點 “http://fa.163.com” that is not equal to the supplied origin. Origin ‘https://fa.163.com‘ is therefore not allowed access.

目前我們的系統(tǒng)同時支持http訪問和https訪問,但是為什么使用 http訪問 ,返回的header中卻是 https 協(xié)議呢?

通過多次模擬,確認(rèn)出現(xiàn)問題的請求中,Request URL使用的協(xié)議和 response返回的headers中的 Access-Control-Allow-Origin 中的 協(xié)議確實不一致,且還有一個特性,X-Cached 為 HIT,如下圖:

 

命中了緩存的請求,出現(xiàn)了協(xié)議不一致?

突然想到,這個接口,我們配置了nginx 緩存,那必然和nginx緩存有關(guān)了。

Nginx 緩存

Nginx (engine x) 是一個高性能的HTTP和反向代理服務(wù)器。

首先從源服務(wù)器(內(nèi)部網(wǎng)絡(luò)上的web服務(wù)器)上獲取內(nèi)容,然后把內(nèi)容返回給用戶,同時,也會把內(nèi)容保存到代理服務(wù)器上一份,這樣日后再接收同樣的信息請求時,他會把本地緩存里的內(nèi)容直接發(fā)給用戶,以此減少后端web服務(wù)器的壓力,提高響應(yīng)速度。這其實就是緩存服務(wù)器所實現(xiàn)的功能。如下圖所示。

 

進入直播間后,首先需要查詢直播內(nèi)容是否有更新,而這個接口客戶端會以5s間隔輪詢,為了減少tomcat的壓力,我們配置了nginx緩存。配置如下

 

其中:

proxy_cache_methods: 用來設(shè)置HTTP哪些方法會被緩存,直播間接口配置了GET、HEAD、POST;

proxy_cache_valid: 用來設(shè)置對不同HTTP狀態(tài)碼的不同緩存時間。直播間接口配置了對于 返回值為200的狀態(tài)碼,緩存5秒;

proxy_cache_min_uses: 用來設(shè)置多少次訪問后,應(yīng)答值會被緩存,配置為3次;

proxy_cache_key: 設(shè)置Web緩存的key

proxy_cache: 用來設(shè)置哪個緩存區(qū)將被使用,并定義緩存區(qū)的名稱

通過上述配置,我們可以看到 proxy_cache_key 配置中,只配置了host + uri + 參數(shù),但沒有配置協(xié)議,所以無論用http訪問,還是https訪問,只要被緩存后,返回的內(nèi)容都是一樣的,而不會區(qū)分http或https。從而引起了跨域問題。

至此,問題分析完畢。

3. 問題解決

跟運維同學(xué)溝通后,通過修改nginx配置,將協(xié)議類型scheme加入到緩存查找的判斷參數(shù)中,配置如下。

 

問題得到了解決。

4. 總結(jié)

上述“慘案” ,是 跨域、nginx緩存、http/https協(xié)議 這三種條件同時出現(xiàn)引發(fā)的。

如果不涉及跨域,混用 http/https協(xié)議 + nginx緩存,其實也是沒有問題的。但是一旦出現(xiàn)了跨域使用,必須 在nginx 緩存配置中,配置 scheme + host + uri + 參數(shù)。 

責(zé)任編輯:龐桂玉 來源: 數(shù)據(jù)庫開發(fā)
相關(guān)推薦

2017-08-24 17:37:18

DNS緩存分析

2021-11-01 17:29:02

Windows系統(tǒng)Fork

2017-09-01 09:17:51

DNS緩存慘案

2022-11-29 21:26:26

跨域配置

2024-05-13 08:37:17

炫技H5UI

2019-04-10 10:32:16

CORSNginx反向代理

2011-04-27 10:02:54

兼容墨盒用戶體驗

2024-07-12 08:52:50

2021-07-24 13:11:19

Redis數(shù)據(jù)技術(shù)

2013-03-22 10:53:42

PyConPython

2023-01-09 18:12:20

多線程故障組件

2010-02-25 15:22:02

2018-04-07 17:13:12

密碼慘案服務(wù)器

2024-02-27 08:14:51

Nginx跨域服務(wù)

2025-03-31 08:30:00

2021-04-27 15:20:41

人工智能機器學(xué)習(xí)技術(shù)

2021-06-15 07:32:59

Cookie和Sess實現(xiàn)跨域

2019-08-14 10:49:20

Python編程語言代碼

2019-09-02 07:42:50

nginx服務(wù)器跨域

2024-05-20 09:28:44

Spring客戶端瀏覽器
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 亚洲一区二区视频 | 久久综合久久久 | 国产精品久久久久久久久 | 亚洲成人久久久 | 国产精品久久久久国产a级 欧美日本韩国一区二区 | 涩在线 | 人人干超碰 | 国产清纯白嫩初高生在线播放视频 | 亚洲欧美bt| 成人在线免费 | 人成精品 | 亚洲欧美一区二区三区国产精品 | 波多野结衣一二三区 | 日日操夜夜干 | 羞羞视频在线观免费观看 | 国产目拍亚洲精品99久久精品 | 成人精品一区二区户外勾搭野战 | 91精品国产91久久久久久吃药 | 中文字幕在线视频网站 | 日韩精品在线看 | 一区二区三区在线 | 亚洲一区二区三区在线播放 | 久久久国产一区 | 欧美在线视频网站 | 国产欧美精品 | 91极品视频| 懂色中文一区二区在线播放 | 日韩乱码一二三 | 亚洲色图在线观看 | 欧美一区二区视频 | av在线成人 | 国产高清亚洲 | 国产精品视屏 | www.久久| 久久久高清 | 午夜爱爱毛片xxxx视频免费看 | 亚洲精品短视频 | 91综合在线视频 | 国产99久久精品一区二区永久免费 | 欧美一二区 | 99精品久久久久久 |