2015年5月28日 星期四

php接收跨域請求

通常表單只能送給同網域的程式來處理 (基於安全性考量),若要跨域的話,會有幾種作法,這邊只討論W3C - CORS (Cross-Origin Resource Sharing)方式。

這是W3C 所制定的方式,目前主流的瀏覽器都有支援,這是透過 HTTP Header 來確認存取權限,算比較寬鬆性的解決跨域方法。

CORS的運作流程:
1、如果瀏覽器有實作 CORS,在發送跨域 Request 之前,會先發出一個 OPTION Request 來詢問目的網站是否接受跨域的 Request。
2、若是這個 OPTION 沒有回應允許傳送的 CORS Headers,那麼原本要發送的 Request 就不會被傳送。若是回應了符合條件的 CORS Headers,瀏覽器就會接著發送跨域的POST Request。

設定如下:
<?php

// Cross-Origin Resource Sharing Header
header('Access-Control-Allow-Origin: http://test.com');
header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS');
header('Access-Control-Allow-Headers: X-Requested-With, Content-Type, Accept');

?>

這些 Headers 是要告訴瀏覽器自己允許何種類型的 HTTP Request 進行跨網域存取,其中定義了允許從哪個網域發 Request 過來 (Access-Control-Allow-Origin,若不限制則網址 改成「*」)、允許使用哪幾種 HTTP Methods (Access-Control-Allow-Methods)、允許夾帶哪些 Headers 等等 (GET, POST, PUT, DELETE, OPTIONS),其他更進階的用法可以參考文件。

此外每次都用 OPTION 詢問有些浪費資源,其實可以透過 Access-Control-Max-Age 這個 Header 來指定規則的有效期限 (類似 Cookie 的機制),這個就沒深入研究了。

參考文件:
http://www.w3.org/TR/cors/

沒有留言:

張貼留言