CORS是一個W3C標準,全稱是"跨域資源共享"(Cross-origin resource sharing)。php
它容許瀏覽器向跨源服務器,發出XMLHttpRequest
請求,從而克服了AJAX只能同源使用的限制。html
詳細介紹見: http://www.ruanyifeng.com/blog/2016/04/cors.htmlnginx
NGINX端:web
location / {
...
add_header 'Access-Control-Allow-Origin' *;
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'Content-Type,Content-Length,Accept-Encoding,X-Requested-with, Origin,Range';
add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';
...ajax
}api
或者 在 PHP代碼中設定 (php代碼中設置了, nginx就不要配置了, 二選一):跨域
<?php header('Access-Control-Allow-Origin:*'); // 設爲星號,表示贊成任意跨源請求。也可配置特定的域名可訪問 如: https://www.xxxx.com header('Access-Control-Allow-Methods:OPTIONS,POST,GET'); // 容許請求的類型 header('Access-Control-Allow-Headers:Content-Type,Content-Length,Accept-Encoding,X-Requested-with, Origin'); header('Access-Control-Expose-Headers:Content-Length,Content-Range');
服務重啓後, 至此 web端可直接 JavaScript 訪問該站點的資源, ajax 亦可。瀏覽器
特別說明:
非同源的請求,會額外產生一次 "預檢"的請求 請求方法 : OPTIONS服務器
OPTIONS /cors HTTP/1.1 Origin: http://api.bob.com Access-Control-Request-Method: PUT Access-Control-Request-Headers: X-Custom-Header Host: api.alice.com Accept-Language: en-US Connection: keep-alive User-Agent: Mozilla/5.0...
"預檢"請求用的請求方法是OPTIONS
,表示這個請求是用來詢問的。頭信息裏面,關鍵字段是Origin
,表示請求來自哪一個源。cors
除了Origin
字段,"預檢"請求的頭信息包括兩個特殊字段。
(1)Access-Control-Request-Method
該字段是必須的,用來列出瀏覽器的CORS請求會用到哪些HTTP方法,上例是PUT
。
(2)Access-Control-Request-Headers
該字段是一個逗號分隔的字符串,指定瀏覽器CORS請求會額外發送的頭信息字段,上例是X-Custom-Header
。
服務器收到"預檢"請求之後,檢查了Origin
、Access-Control-Request-Method
和Access-Control-Request-Headers
字段之後,確認容許跨源請求,就能夠作出迴應。
這個環節,由瀏覽器控制,用戶無感知。