2012-04-13 175 views
292

我正在向Sencha Touch 2應用程序(包裝在PhoneGap中)中的遠程PHP服務器製作Ajax.request訪問控制 - 允許來源不允許來源

來自服務器的響應如下:

的XMLHttpRequest不能加載http://nqatalog.negroesquisso.pt/login.php。 Access-Control-Allow-Origin不允許原產地http://localhost:8888

我怎樣才能解決這個問題?

+16

而使用jQuery,設置'數據類型: 'JSONP','不順便特技 – amit 2012-10-11 12:45:29

+9

不是從所述響應服務器。準確地說,錯誤發生在客戶端。 – matteo 2013-02-01 17:41:34

+2

jsonp技巧可能不再工作,fyi:http://stackoverflow.com/questions/12216208/chrome-now-blocking-all-jsonp-requests-from-https-to-http – drewww 2013-08-19 18:30:02

回答

350

我就這個問題寫了一篇文章而回,Cross Domain AJAX

如果你有響應的服務器的控制權來處理最簡單的方法是添加一個響應頭爲:

Access-Control-Allow-Origin: * 

這將允許跨域Ajax。在PHP中,你將要修改的響應,像這樣:

<?php header('Access-Control-Allow-Origin: *'); ?> 

你可以只是把Header set Access-Control-Allow-Origin *設置在Apache配置或htaccess文件。它就像一個魅力。

從評論,這是一個重要的說明:通配符將允許任何域發送請求到您的主機。我建議將星號替換爲您將在上運行腳本的特定域。

+4

我會聯繫我的服務器提供商。謝謝 – Ricardo 2012-04-13 15:04:52

+7

這是否有任何安全問題?例如,[本答案](http://stackoverflow.com/a/9327231/1431728)表示,「由於安全原因,JavaScript受到」相同來源策略「的限制。例如,惡意腳本無法聯繫遠程服務器並從您的網站發送敏感數據。「 – JohnK 2012-11-02 18:14:43

+4

真棒,我只是把它放在我的node.js服務器文件中: response.writeHead(200,{'Content-Type':contentType,'Access-Control-Allow-Origin':'*'}); 它的工作。謝謝! – vbullinger 2012-11-29 04:33:38

5

這是因爲same-origin policy。請參閱Mozilla Developer NetworkWikipedia

基本上,在你的例子中,你只需要從nqatalog.negroesquisso.pt加載http://nqatalog.negroesquisso.pt/login.php頁面,而不是localhost

+1

但我需要從移動設備加載web服務,我會繞過這個? – Ricardo 2012-04-13 14:54:42

+0

那麼你需要做一些服務器端的更改或使用JSONP http://en.wikipedia.org/wiki/JSONP – antyrat 2012-04-13 14:55:50

59

如果你不要有控制服務器,你可以簡單地添加這個參數到你的Chrome啓動器:--disable-web-security

注意,我不會用這個正常的「網上衝浪」。作爲參考,看到這個職位:Disable same origin policy in Chrome

您使用Phonegap實際構建應用程序並將其加載到設備上,這不會是一個問題。

+0

謝謝。但我的應用程序運行在移動設備上,我無法將參數傳遞給我的webview包裝器。 – Ricardo 2012-04-13 16:52:58

+0

不要先在瀏覽器中測試你的應用程序嗎?你如何調試? – 2012-04-13 17:33:39

+0

是的,我在Chrome瀏覽器中調試,但該應用程序不會在Chrome上運行。這將是我無法控制的電話webview女巫。 – Ricardo 2012-04-16 10:25:50

10

馬特Mombrea是服務器端是正確的,你可能會遇到被拒絕列入白名單的另一個問題。

你必須配置你的phonegap.plist。 (我正在使用老版本的phonegap)

對於cordova,命名和目錄可能會有一些變化。但步驟應該大致相同。

首先選擇支持文件> PhoneGap。plist中

enter image description here

然後在 「ExternalHosts」

添加一個條目,帶有也許 「http://nqatalog.negroesquisso.pt」 我使用的是值*僅用於調試目的。

enter image description here

+0

謝謝你的時間。 – Ricardo 2012-04-23 08:49:44

41

如果你使用Apache只需添加:

<ifModule mod_headers.c> 
    Header set Access-Control-Allow-Origin: * 
</ifModule> 

在您的配置。這將導致您的網絡服務器的所有響應都可以從互聯網上的任何其他站點訪問。

Header set Access-Control-Allow-Origin: http://my.origin.host 
+3

不要忘了加載模塊:a2enmod頭 – 2012-10-25 13:58:27

+0

如何加載模塊:a2enmod頭? – Ayesha 2015-12-16 16:10:31

7

我曾與各種工作時,碰上了幾次:如果您打算只允許通過特定的服務器使用主機上的服務,您可以與發信服務器的URL替換*蜜蜂。通常快速修復是添加「& callback =?」到一個字符串的末尾。有時,&符號必須是字符代碼,有時候是「?」:「?callback =?」 (請參閱Forecast.io API Usage with jQuery

4

我們在chrome中測試的phonegap應用程序也有同樣的問題。 打開Chrome之前,我們每天在批處理文件中使用的一臺Windows機器。 請記住,在運行此操作之前,您需要從任務管理器中清除所有chrome實例,或者可以選擇chrome以不在後臺運行。

批次:(使用CMD)

cd D:\Program Files (x86)\Google\Chrome\Application\chrome.exe --disable-web-security 
5

如果你得到這個Angular.js,然後確保你逃避你這樣的端口號:

var Project = $resource(
    'http://localhost\\:5648/api/...', {'a':'b'}, { 
     update: { method: 'PUT' } 
    } 
); 

更多信息,請參見here上它。

15

這是第一個問題/答案試圖解決使用ASP.NET MVC作爲我的數據源的同樣的問題時彈出我。我意識到這並不能解決PHP的問題,但它足夠有價值。

我正在使用ASP.NET MVC。 blog post from Greg Brant爲我工作。最終,您可以創建一個屬性,您可以將其添加到控制器操作的屬性[HttpHeaderAttribute("Access-Control-Allow-Origin", "*")]

例如:

public class HttpHeaderAttribute : ActionFilterAttribute 
{ 
    public string Name { get; set; } 
    public string Value { get; set; } 
    public HttpHeaderAttribute(string name, string value) 
    { 
     Name = name; 
     Value = value; 
    } 

    public override void OnResultExecuted(ResultExecutedContext filterContext) 
    { 
     filterContext.HttpContext.Response.AppendHeader(Name, Value); 
     base.OnResultExecuted(filterContext); 
    } 
} 

,然後使用它:

[HttpHeaderAttribute("Access-Control-Allow-Origin", "*")] 
public ActionResult MyVeryAvailableAction(string id) 
{ 
    return Json("Some public result"); 
} 
+1

WebApi 2現在已內置此功能。 http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api – 2014-01-26 14:17:10

7

這可能是很方便的人誰需要一個例外都「WWW」和「無www」版本引薦的:

$referrer = $_SERVER['HTTP_REFERER']; 
$parts = parse_url($referrer); 
$domain = $parts['host']; 

if($domain == 'google.com') 
{ 
     header('Access-Control-Allow-Origin: http://google.com'); 
} 
else if($domain == 'www.google.com') 
{ 
     header('Access-Control-Allow-Origin: http://www.google.com'); 
} 
+0

我指出在解決ACAO誤差與蔚藍的正確方向。雖然我已經添加了允許的Google主機名。使用的URL需要爲https:// googledrive/NOT https://www.googledrive/ – Kildareflare 2013-11-12 00:54:10

15

如果你有一個ASP.NET/ASP.NET MVC應用,你可以通過網頁包含這個頭文件。配置文件:

<system.webServer> 
    ... 

    <httpProtocol> 
     <customHeaders> 
      <!-- Enable Cross Domain AJAX calls --> 
      <remove name="Access-Control-Allow-Origin" /> 
      <add name="Access-Control-Allow-Origin" value="*" /> 
     </customHeaders> 
    </httpProtocol> 
</system.webServer> 
+1

.NET MVC People,請點擊此處!我實際上會打出一個解決方案,並在我的博客上指出這個答案,以便人們可以更輕鬆地找到答案。沒有比嘗試通過.NET/MVC障礙更糟糕的事情,除了PHP/jQuery解決方案之外沒有任何東西可以找到。謝謝@ Caio-Proiete – ottoflux 2013-11-04 14:02:51

+1

這是怎麼回事?我使用的是Chrome,並試圖從我的本地主機訪問雅虎財經頁面。 – newman 2014-07-07 18:13:52

+1

感謝它爲我工作。我已經在服務器端代碼項目(web.config)中添加了。 – ethem 2015-03-19 23:13:02

5

Ruby on Rails,你可以在控制器裏做:

headers['Access-Control-Allow-Origin'] = '*' 
+0

如果是ajax調用,你把這個控制器放在哪裏?我能看到更多的代碼上下文嗎? – rigdonmr 2016-10-12 21:56:56

7

我會給你這一個簡單的解決方案。在我的情況下,我無法訪問服務器。在這種情況下,您可以更改您的Google Chrome瀏覽器中的安全策略以允許訪問控制允許來源。這是非常簡單的:

  1. 創建一個Chrome瀏覽器快捷方式
  2. 右鍵點擊快捷方式圖標 - >屬性 - >快捷方式 - >目標

簡單粘貼在"C:\Program Files\Google\Chrome\Application\chrome.exe" --allow-file-access-from-files --disable-web-security

該位置可能會有所不同。現在點擊該快捷方式打開Chrome。

+1

禁用網絡安全似乎不是理想的解決方案... – kdazzle 2014-03-11 22:12:44

6

如果你正在寫一個Chrome擴展,並得到這個錯誤,那麼可以肯定你已經添加了API的基礎URL到您的manifest.jsonpermissions block,例如:

"permissions": [ 
    "https://itunes.apple.com/" 
] 
0

當您收到請求您可以

var origin = (req.headers.origin || "*"); 

當你不得不用的反應類似的東西去比:

res.writeHead(
    206, 
    { 
     'Access-Control-Allow-Credentials': true, 
     'Access-Control-Allow-Origin': origin, 
    } 
); 
5

您可以通過在HTTP OPTIONS的響應中創建包括頭文件Access-Control-Allow-Origin: *的瀏覽器來修改服務器而無需修改服務器。在Chrome中使用this extension。如果你在Mozilla檢查this answer

+0

非常感謝.... – 2016-08-22 14:47:51

1

在Ruby Sinatra

response['Access-Control-Allow-Origin'] = '*' 

爲大家或

response['Access-Control-Allow-Origin'] = 'http://yourdomain.name' 
6

,如果你是在Apache,只需添加一個。htaccess文件目錄與此內容:

頁眉設置訪問控制允許來源:*

頁眉設置訪問控制允許報頭:內容類型

頁眉設置訪問控制 - 允許的方法:*

1
**Add this meta tag in your Webservice** 


header('Content-type: application/json'); 
header('Access-Control-Allow-Origin: *'); 
相關問題