2015-12-22 12 views
5

mein Szenario von zwei Webserver einem lokalen und einem entfernten besteht.Access-Control-Allow-Origin AngularJS php

Lokale Webserver (Apache) verarbeiten eine Web-App, in der ich eine Ajax-Anfrage an Remote-Webserver (Lighttpd) machen möchte.

Ajax Anfrage Verwendung 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!"); 
}); 

Remote-PHP-Skript ist:

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

Leider bekam ich ein

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. 

Remote-Web-Server-Authentifizierungsmodus aktivieren und CORS Anforderung konfiguriert .htpasswd hat.

ein Stück lighttpd.conf

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

Welchen Browser Sie @gravi verwenden? – noahdotgansallo

+0

Sowohl Chrome und Firefox – gravi

+0

Ich hatte das gleiche Problem, und offenbar blockiert Chrom gerade alle diese Arten von Anfragen, trotz der Header – noahdotgansallo

Antwort

0

Folgen Da Sie ein Cross-Domain-POST tun, Angular ist ein Pre-Flight-OPTIONS antrag der Access Origin-Header zu überprüfen, bevor der POST zu machen. Die NET-Registerkarte in Ihrem Browser wird dies bestätigen. Ihr Server reagiert nicht gut auf die Anfrage OPTIONEN und deshalb weigert Eckige zu den POST zu machen.

Wenn Sie POST auf Ihren Server mit POSTMAN ist alles in Ordnung?

Ich glaube, es ist möglich, Angular zu konfigurieren, um die Anforderung vor dem Flug nicht zu machen.

Alternativ können Sie Ihren Server so konfigurieren, dass er auf OPTIONS-Anforderungen korrekt reagiert, insbesondere die richtigen Access Origin-Header als Antwort auf die OPTIONS-Anforderung zurückgibt. (OPTIONS versucht nur herauszufinden, ob Ihr Server diese Header gesetzt hat, wenn nicht, warum sollten Sie den POST machen?)

Hoffentlich weisen Sie diese Information in die richtige Richtung.

2

Damit add-response-header in lighttpd funktioniert, müssen Sie mod_setenv in Ihren server.modules aktivieren. Allerdings musst du mod_setenv vor mod_status aktivieren.

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

Alternativ können Sie PHP zur Ausgabe der CORS-Kopfzeile

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

verwenden Ich möchte auch hinzufügen, dass, wenn Sie senden http basic/Auth Daten verdauen Sie für den Ursprung Platzhalter verwenden können nicht. Sie haben die eigentliche Quelldomäne verwenden

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