2015-12-22 49 views
5

我的方案是由兩個網絡服務器一個本地和一個遠程。訪問控制 - 允許 - 來源angularjs到PHP

本地Web服務器(Apache)的過程中,我希望做一個Ajax請求遠程web服務器(lighttpd的)一個Web應用程序。

Ajax請求使用angularjs $ http。

var req = { 
    method: 'POST', 
    url: 'http://url/myphp.php', 
    headers: { 
     'Authorization': 'Basic ' + btoa('username:password'), 
     'Content-Type': 'application/x-www-form-urlencoded' 
    }, 
    xhrFields: { 
     withCredentials: true 
    }, 
    crossDomain: true, 
    data: xmlString 
} 

$http(req).then(function() { 
    console.log("OK!"); 
}); 

遠程PHP腳本是:

<?php 
    echo "You have CORS!"; 
?> 

不幸的是我得到了

401 Unhauthorized 
XMLHttpRequest cannot load http://url/myphp.php. Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:8888' is therefore not allowed access. The response had HTTP status code 401. 

遠程Web服務器htpasswd的身份驗證模式啓用和配置CORS請求。

按照一塊lighttpd.conf

setenv.add-response-header = ("Access-Control-Allow-Origin" => "*") 
+0

您使用@gravi什麼瀏覽器? – noahdotgansallo

+0

Chrome和火狐瀏覽器 – gravi

+0

我也遇到了同樣的問題,顯然,Chrome直接阻止了所有這些類型的請求,儘管標頭 – noahdotgansallo

回答

0

的因爲你正在做一個跨域POST,角正在飛行前OPTIONS請求作出POST之前檢查訪問起源頭。 瀏覽器中的NET標籤將確認這一點。 您的服務器對OPTIONS請求的反應不佳,因此Angular拒絕發佈POST。

如果你POSTMAN到你的服務器是一切OK?

我相信這是可以配置角度不使飛行前的請求。

或者,將服務器配置爲響應OPTIONS請求返回正確的訪問起源頭正確應對OPTIONS請求,尤其如此。 (OPTIONS只是試圖找出如果你的服務器有這些頭設置,如果它不是那麼何必做這個職位嗎?)

希望這些信息將指向您在正確的方向。

2

對於外接應答頭在lighttpd的工作,你必須在你的server.modules使mod_setenv。但是,您必須在mod_status之前啓用此mod_setenv。

server.modules = (
    # ... 
    "mod_fastcgi", 
    "mod_rewrite", 
    "mod_redirect", 
    "mod_setenv", ## before mod_status 
    "mod_status", 
    # ... 
) 

另外,您可以使用PHP來輸出CORS廣告標題

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

我也想補充一點,如果你要發送HTTP基本/摘要身份驗證數據,你不能使用通配符的起源。您必須使用實際源域

setenv.add-response-header = ("Access-Control-Allow-Origin" => "example.com") 
setenv.add-response-header = ("Access-Control-Allow-Credentials" => "true")