PHP 跨域資源共享 CORS 設定

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

服務器收到"預檢"請求之後,檢查了OriginAccess-Control-Request-MethodAccess-Control-Request-Headers字段之後,確認容許跨源請求,就能夠作出迴應。

 

這個環節,由瀏覽器控制,用戶無感知。

相關文章
相關標籤/搜索