js跨域訪問,No ‘Access-Control-Allow-Origin‘ header is present on
在本地用ajax跨域訪問請求時報錯:
XMLHttpRequest cannot loadhttp://www.zjblogs.com/. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access.
查了一翻資料,發現原來是新W3C標準中是這樣規定的:
最新的W3C標準裡是這麼實現HTTP跨域請求的, Cross-Origin Resource Sharing
簡單的來說,就是跨域的目標伺服器要返回一系列的Headers,通過這些Headers來控制是否同意跨域。這些Headers有:4 Syntax
-
4.3
Access-Control-Allow-Credentials
HTTP Response Header -
4.8
Access-Control-Request-Headers
HTTP Request Header
在 Request 包和 Response 包中都有一些。
其中最敏感的就是 Access-Control-Allow-Origin 這個 Header, 他是W3C標準裡用來檢查該跨域請求是否可以被通過。 (Access Control Check)
跨域實現的過程大致如下:
從 http://www.a.com/test.html 發起一個跨域請求,
請求的地址為: http://www.b.com/test.php
如果 伺服器B返回一個如下的header
Access-Control-Allow-Origin: http://www.a.com
那麼,這個來自 http://www.a.com/test.html 的跨域請求就會被通過。
如上所知,總結解決辦法如下:
1、如果請求的url是aspx頁面,則需要在aspx頁面中新增程式碼:Response.AddHeader("Access-Control-Allow-Origin", "*");
2、如果請求的url是PHP頁面,則需要在PHP頁面中新增程式碼:header("Access-Control-Allow-Origin: *");
3、如果請求的url是靜態的html頁面,則需要在頁面中新增meta標籤程式碼:<meta http-equiv="Access-Control-Allow-Origin" content="*" />
如果伺服器端可以確定是要被哪些域名訪問,最好是能把以上程式碼中的“*”代替為具體的域名,這樣做可以相應的增強安全性。