访问控制允许来源 angularjs 到 php
Posted
技术标签:
【中文标题】访问控制允许来源 angularjs 到 php【英文标题】:Access-Control-Allow-Origin angularjs to php 【发布时间】:2016-03-28 12:22:20 【问题描述】:我的场景由两台网络服务器组成,一台本地,一台远程。
本地网络服务器 (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" => "*" )
【问题讨论】:
你使用什么浏览器@gravi? Chrome 和 Firefox 我遇到了同样的问题,而且很明显,chrome 直接阻止了所有这些类型的请求,尽管有标题 【参考方案1】:要使 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 基本/摘要身份验证数据,则不能使用通配符作为来源。您必须使用实际的源域
setenv.add-response-header = ( "Access-Control-Allow-Origin" => "example.com" )
setenv.add-response-header = ( "Access-Control-Allow-Credentials" => "true" )
【讨论】:
【参考方案2】:*
不能在凭证的情况下使用。
服务器无视您的
setenv.add-response-header
声明。
在这里查看答案:
CORS: Cannot use wildcard in Access-Control-Allow-Origin when credentials flag is true
【讨论】:
【参考方案3】:因为您正在执行跨域 POST,Angular 正在发出飞行前 OPTIONS 请求以在进行 POST 之前检查 Access Origin 标头。 浏览器中的 NET 选项卡将确认这一点。 您的服务器没有很好地响应 OPTIONS 请求,因此 Angular 拒绝进行 POST。
如果你用 POSTMAN POST 到你的服务器,一切正常吗?
我相信可以将 Angular 配置为不发出飞行前请求。
或者,配置您的服务器以正确响应 OPTIONS 请求,特别是返回正确的 Access Origin 标头以响应 OPTIONS 请求。 (OPTIONS 只是试图找出您的服务器是否设置了这些标头,如果没有,那么为什么还要麻烦进行 POST?)
希望这些信息能为您指明正确的方向。
【讨论】:
以上是关于访问控制允许来源 angularjs 到 php的主要内容,如果未能解决你的问题,请参考以下文章