nginx學習篇(五)利用nginx實現附加功能

跨域問題

問題由來:瀏覽器拒絕執行其它域名下的ajax運作
在這裏插入圖片描述

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script>
function loadXMLDoc()
{
	var xmlhttp;
	if (window.XMLHttpRequest)
	{
		//  IE7+, Firefox, Chrome, Opera, Safari 瀏覽器執行代碼
		xmlhttp=new XMLHttpRequest();
	}
	else
	{
		// IE6, IE5 瀏覽器執行代碼
		xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
	}
	xmlhttp.onreadystatechange=function()
	{
		if (xmlhttp.readyState==4 && xmlhttp.status==200)
		{
			document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
		}
	}
	xmlhttp.open("GET","http://192.168.59.129/cros",true); //這裏的URL是我nginx的服務地址
	xmlhttp.send();
}
</script>
</head>
<body>

<div id="myDiv"><h2>使用 AJAX 修改該文本內容</h2></div>
<button type="button" onclick="loadXMLDoc()">修改內容</button>

</body>
</html>

這裏我本地模擬了ajax請求我的nginx服務器獲得的頁面是
在這裏插入圖片描述
但是按住按鈕並不能加載出nginx返回的數據,而正常訪問nginx卻可以獲取數據
在這裏插入圖片描述
這是因爲chrome拒絕執行ajax請求得到的返回值
此問題常見解決方案:
1、最常用的是,jsonp。此方案需要前後端共同協作來解決。
2、cors跨域,此方式非常優雅,是w3c組織制定的解決方案。爲目前主流方案。方案流程如下圖:
在這裏插入圖片描述
當chrome發現ajax請求的網址,與當前主域名不一致(跨域)時,會在請求header中追加值頁面主域名值,即:origin
在這裏插入圖片描述
nginx在接收到ajax請求時,會查看origin值,即請求我的網址是誰?
此處使用正則來校驗,nginx追加header值:access-control-allow-origin = (匹配所有)
在這裏插入圖片描述
chrome收到ajax返回值後,查看返回的header中access-control-allow-origin的值,發現其中的值是
,正是所有的頁面主域名。這是允許訪問,於是執行ajax返回值內容。
在這裏插入圖片描述

防盜鏈

目的:
1、讓資源只能在我的頁面內顯示
2、不能單獨來取或者下載

流程:
1、chrome以url1首次請求web服務器,得到html頁面。
2、chrome再次發起url2資源請求,攜帶referers = url1。(注意,是url1,不是本次的url2)
3、nginx校驗referers值,決定是否允許訪問。

4、下面是nginx校驗referers值的過程:
valid_referers:匹配域名白名單,如果不匹配,把內置變量$invalid_referers置爲1,進入if塊,返回404
在這裏插入圖片描述

緩存

expires命令:過期時間
在這裏插入圖片描述

https

https瀏覽器上公鑰(在證書裏),如下圖
在這裏插入圖片描述
交互過程:
在這裏插入圖片描述
a.瀏覽器使用公鑰,把數據加密後,再發送出去經過公鑰加密內容,只有有私鑰的人(nginx服務器)纔看得懂。
b.nginx配置https的時候,需要兩個東西:(此兩樣需購買)一個key,私鑰。放在nginx服務器裏面,僅此一份一個證書,公鑰,供瀏覽器去下載。
配置方式如下圖:
在這裏插入圖片描述
c.配置好https方式之後,對http請求重定向
在這裏插入圖片描述
在這裏插入圖片描述

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