2015-12-22 13 views
5

il mio scenario è composto da due server web uno locale e uno remoto.Access-Control-Allow-Origin angularjs su php

Il server Web locale (Apache) elabora un'app Web in cui voglio effettuare una richiesta Ajax al server Web remoto (Lighttpd).

Ajax richiesta uso 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!"); 
}); 

script php remoto è:

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

Purtroppo ho avuto un

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. 

server Web remoti, ha Htpasswd modalità di autenticazione e abilitazione richiesta CORS configurato.

seguire un pezzo di lighttpd.conf

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

Quale browser stai usando @gravi? – noahdotgansallo

+0

Sia Chrome che Firefox – gravi

+0

Ho avuto lo stesso problema e, a quanto pare, Chrome ha risolto tutti questi tipi di richieste, nonostante le intestazioni – noahdotgansallo

risposta

0

Perché si sta facendo un POST dominio croce, angolare sta facendo una richiesta di opzioni pre-volo per controllare le intestazioni di accesso origine prima di fare il POST. La scheda NET nel tuo browser lo confermerà. Il server non risponde bene alla richiesta OPTIONS e pertanto Angular rifiuta di effettuare il POST.

Se il POST sul server con POSTMAN è tutto OK?

Credo che sia possibile configurare Angolare per non effettuare la richiesta di pre-volo.

In alternativa, configurare il server in modo che risponda correttamente alle richieste OPTIONS, in particolare restituendo le intestazioni di origine di Access corrette in risposta alla richiesta OPTIONS. (OPZIONI sta solo cercando di scoprire se il tuo server ha queste intestazioni impostate, se non ha quindi perché preoccuparsi di fare il POST?)

Speriamo che questa informazione ti indichi la giusta direzione.

2

Per add-response-header per funzionare in lighttpd è necessario abilitare mod_setenv nei server.modules. Tuttavia, devi abilitare questo mod_setenv prima di mod_status.

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

In alternativa è possibile utilizzare PHP per emettere i cors intestazione

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

Voglio anche aggiungere che se si sta inviando http base/digest dati di autenticazione non è possibile utilizzare i caratteri jolly per l'origine. Devi usare il dominio di origine effettiva

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