Access-Control-Allow-Origin angularjs到php

时间:2015-12-22 09:27:13

标签: php angularjs http cors lighttpd

我的场景由两个网络服务器组成,一个是本地的,另一个是远程的。

本地网络服务器(Apache)处理一个网络应用程序,我想在其中向远程网络服务器(Lighttpd)发出ajax请求。

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" => "*" )

3 个答案:

答案 0 :(得分:2)

要使add-response-header在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 basic / digest auth数据,则不能使用通配符作为原点。您必须使用实际的源域

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

答案 1 :(得分:0)

因为您正在进行跨域POST,所以Angular正在进行飞行前OPTIONS请求,以便在进行POST之前检查Access Origin标头。 浏览器中的NET选项卡将确认这一点。 您的服务器对OPTIONS请求没有很好的响应,因此Angular拒绝进行POST。

如果使用POSTMAN向服务器POST,一切正常吗?

我相信可以将Angular配置为不进行飞行前请求。

或者,将服务器配置为正确响应OPTIONS请求,特别是返回正确的Access Origin标头以响应OPTIONS请求。 (OPTIONS只是试图找出你的服务器是否设置了这些标头,如果它还没有那么为什么要打扰POST?)

希望这些信息能为您指明方向。

答案 2 :(得分:0)

*不能用于凭证。

服务器无视你的 setenv.add-response-header声明。

见答案:

CORS: Cannot use wildcard in Access-Control-Allow-Origin when credentials flag is true