簡體   English   中英

跨域 XMLHttpRequest、Access-Control-Allow-Origin 標頭和 $_SERVER['HTTP_ORIGIN']

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM