我的场景由两个网络服务器组成,一个是本地的,另一个是远程的。
本地网络服务器(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" => "*" )
答案 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