Nginx跨域及Https配置


一、跨域

1. 什么是跨域?

跨域:指的是瀏覽器不能執行其他網站的腳本。它是由瀏覽器的同源策略造成的,是瀏覽器對javascript施加的安全限制(指一個域下的文檔或腳本試圖去請求另一個域下的資源,這里跨域是廣義的)

例如:a頁面想獲取b頁面資源,如果a、b頁面的協議、域名、端口、子域名不同,所進行的訪問行動都是跨域的,而瀏覽器為了安全問題一般都限制了跨域訪問,也就是不允許跨域請求資源。注意:跨域限制訪問,其實是瀏覽器的限制。理解這一點很重要!!!

廣義的跨域:

1.) 資源跳轉:A鏈接、重定向、表單提交

2.) 資源嵌入:<link>、<script><img>、<frame>等dom標簽,還有樣式中background:url()、@font-face()等文件外鏈

3.) 腳本請求:js發起的ajax請求、dom和js對象的跨域操作等其實我們通常所說的跨域是狹義的,是由瀏覽器同源策略限制的一類請求場景。

2. 什么是同源策略?

源策略/SOP(Same origin policy)是一種約定,由Netscape公司1995年引入瀏覽器,它是瀏覽器最核心也最基本的安全功能,如果缺少了同源策略,瀏覽器很容易受到XSS、CSFR等攻擊。所謂同源是指"協議+域名+端口"三者相同(其中有一個不同都會產生跨域),即便兩個不同的域名指向同一個ip地址,也非同源。

同源策略限制以下幾種行為:

1.) Cookie、LocalStorage 和 IndexDB 無法讀取

2.) DOM 和 Js對象無法獲得

3.) AJAX 請求不能發送

3. 常見跨域場景

3.跨域訪問示例

假設有兩個網站,A網站部署在:http://localhost:81 即本地ip端口81上;

B網站部署在:http://localhost:82 即本地ip端口82上。

現在A網站的頁面想去訪問B網站的信息,A網站頁面的代碼如下(這里使用jquery的異步請求)

$(function (){

    $.get("http://localhost:82/api/values", {},function (result) {

          $("#show").html(result);

  })});

 

從錯誤信息可以看出以上出現了跨域問題!

4. 跨域解決方案

1、 通過jsonp跨域
2、 document.domain + iframe跨域
3、 location.hash + iframe
4、 window.name + iframe跨域
5、 postMessage跨域
6、 跨域資源共享(CORS)
7、 nginx代理跨域
8、 nodejs中間件代理跨域
9、 WebSocket協議跨域

5. nginx跨域解決方案

方案一:

先上圖:

 

 

首先我們用nginx作為代理服務器和用戶交互,這樣用戶就只需要在80端口上進行交互就可以了,這樣就避免了跨域問題,因為我們都是在80端口上進行交互的;

下面我們看一下利用nginx作為反向代理的具體配置:

server {

        listen      80; #監聽80端口,可以改成其他端口

        server_name  localhost; # 當前服務的域名

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {

            proxy_pass http://localhost:81;

            proxy_redirect default;

        }

location /apis { #添加訪問目錄為/apis的代理配置

rewrite  ^/apis/(.*)$ /$1 break;

proxy_pass  http://localhost:82;

      }

#以下配置省略

1.當用戶發送localhost:80/時會被nginx轉發到http://localhost:81服務;

2.當界面請求接口數據時,只要以/apis 為開頭,就會被nginx轉發到后端接口服務器上;

總結:nginx實現跨域的原理,實際就是把web項目和后端接口項目放到一個域中,這樣就不存在跨域問題,然后根據請求地址去請求不同服務器(真正干活的服務器);

方案二:

(1)nginx配置解決iconfont跨域

瀏覽器跨域訪問js、css、img等常規靜態資源被同源策略許可,但iconfont字體文件(eot|otf|ttf|woff|svg)例外,此時可在nginx的靜態資源服務器中加入以下配置。

 location /{

add_header Access-Control-Allow-Origin *;

}

(2) nginx反向代理接口跨域

跨域原理: 同源策略是瀏覽器的安全策略,不是HTTP協議的一部分。服務器端調用HTTP接口只是使用HTTP協議,不會執行JS腳本,不需要同源策略,也就不存在跨越問題。

實現思路:通過nginx配置一個代理服務器(域名與domain1相同,端口不同)做跳板機,反向代理訪問domain2接口,並且可以順便修改cookie中domain信息,方便當前域cookie寫入,實現跨域登錄。

nginx具體配置:

 #proxy服務器

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;


# 當用webpack-dev-server等中間件代理接口訪問nignx時,此時無瀏覽器參與,故沒有同源限制,下面的跨域配置可不啟用
add_header Access-Control-Allow-Origin http://www.domain1.com; #當前端只跨域不帶cookie時,可為*

add_header Access-Control-Allow-Credentials true;

  }
}

1.) 前端代碼示例:

var xhr = new XMLHttpRequest(); 
// 前端開關:瀏覽器是否讀寫
cookie
xhr.withCredentials = true;
// 訪問nginx中的代理服務器
xhr.open('get', 'http://www.domain1.com:81/?user=admin', true);
xhr.send();

2.) Nodejs后台示例:

var http = require('http');
var server = http.createServer();
var qs = require('querystring');

server.on('request', function(req, res) {
var params = qs.parse(req.url.substring(2));
// 向前台寫cookie
res.writeHead(200, {
'Set-Cookie': 'l=a123456;Path=/;Domain=www.domain2.com;HttpOnly'
// HttpOnly:腳本無法讀取
});

res.write(JSON.stringify(params));
res.end();
});

server.listen('8080');
console.log('Server is running at port 8080...');

二、Https配置

HTTPS是一種通過計算機網絡進行安全通信的傳輸協議,經由HTTP進行通信,利用SSL/TLS建立全信道,加密數據包。HTTPS使用的主要目的是提供對網站服務器的身份認證,同時保護交換數據的隱私與完整性。

PS:TLS是傳輸層加密協議,前身是SSL協議,由網景公司1995年發布,有時候兩者不區分。

ca是ssl證書的簽發機構

ssl證書可以購買阿里雲免費證書 

https://yundunnext.console.al...

下載nginx版證書,添加到服務器中,

配置nginx:

 

 同時監聽80和443端口,當使用http訪問自動跳轉到https,根據if($schema ==hhtp)完成 

ssl_certificate配置證書路徑 

ssl_certificate_key 配置key路徑 

保存,重啟nginx。 

啟動發現訪問 ailijie.top成功跳轉為 https://ailijie.top 

使用https后站點內所有的請求都要使用https不然會被瀏覽器進行攔截。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM