[英]Cross-domain JavaScript: No 'Access-Control-Allow-Origin' header is present
[英]Cross-domain XMLHttpRequest, Access-Control-Allow-Origin header and $_SERVER['HTTP_ORIGIN']
我需要一個腳本來通過 XMLHttpRequest 將信息傳送到托管在不同域上的請求頁面。 關於這個主題有很多問題和答案,但我發現沒有一個能完全回答我的問題。
在網上搜索讓我發現我必須通過標頭允許這些域,例如header("Access-Control-Allow-Origin: *");
或者header("Access-Control-Allow-Origin: http://example.com");
由於我需要多個外部域,但我仍然發現*
太開放了,進一步的研究使我找到了依賴於$_SERVER['HTTP_ORIGIN']
與授權值的服務器端比較的解決方案。 (在 StackOverflow: Access-Control-Allow-Origin Multiple Origin Domains?例如)
但是我發現在 php 手冊( http://php.net/manual/fr/reserved.variables.server.php )中沒有提到$_SERVER['HTTP_ORIGIN']
並且我的測試顯示這個條目並不總是被設置。
所以我的問題是:
- 何時設置$_SERVER['HTTP_ORIGIN']
超全局設置?
- 它在全球范圍內可靠嗎?...還是依賴於客戶端瀏覽器?
似乎(但僅憑經驗,從我的測試/Firefox 34.0.5 和 ios Safari)它僅在“需要”時才設置,即當請求實際上來自另一個域時。
請參閱下面的短代碼摘錄以幫助理解需求
- 如果$_SERVER['HTTP_ORIGIN']
未定義,則不發送標頭
(假設它實際上不是跨域調用,應該沒有任何問題),
- 如果已定義並屬於一組接受域,則發送“允許”標頭。
if(isset($_SERVER['HTTP_ORIGIN'])) {// in case of cross domain ajax call
$http_origin = $_SERVER['HTTP_ORIGIN'];
if(in_array($http_origin, $ajaxAllowedDomains))
{ header("Access-Control-Allow-Origin: $http_origin"); }
}
$_SERVER['HTTP_ORIGIN']
超全局設置是什么時候?
當 HTTP 請求包含Origin
標頭時。 瀏覽器在使用 XMLHttpRequest 進行跨域請求時會設置一個。
它在全球范圍內可靠嗎?
在您可能想要設置 CORS 響應標頭的情況下。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.