预检响应中的 Access-Control-Allow-Headers 不允许请求标头字段 Access-Control-Allow-Headers
Posted
技术标签:
【中文标题】预检响应中的 Access-Control-Allow-Headers 不允许请求标头字段 Access-Control-Allow-Headers【英文标题】:Request header field Access-Control-Allow-Headers is not allowed by Access-Control-Allow-Headers in preflight response 【发布时间】:2016-05-15 21:37:51 【问题描述】:我正在尝试从跨域创建登录页面但我无法解决问题,错误是:
XMLHttpRequest 无法加载 http://localhost/testing/resp.php。。
我的 javascript 代码是:
$('#login').click(function()
var username = $('#uname').val();
var password = $('#pass').val();
var result = $('.result');
result.text('loading....');
if (username != '' && password !='')
var urltopass = 'action=login&username='+username+'&password='+password;
$.ajax(
type: 'POST',
data: urltopass,
headers: "Access-Control-Allow-Headers": "Content-Type",
url: 'http://localhost/testing/resp.php',
crossDomain: true,
cache: false,
success: function(responseText)
console.log(responseText);
if(responseText== "0")
result.text('incorrect login information');
else if (responseText == "1")
window.location="http://localhost/testing/home.php";
else
alert('error in sql query \n' + responseText);
);
else return false;
);
http://localhost/testing/resp.php 的 PHP 代码:
<?php
include "db.php"; //Connecting to database
if (!isset($_SERVER['HTTP_ORIGIN']))
echo "This is not cross-domain request";
exit;
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Credentials: true");
header("Access-Control-Allow-Methods: POST, GET, OPTIONS");
header("Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With");
header('P3P: CP="CAO PSA OUR"'); // Makes IE to support cookies
header("Content-Type: application/json; charset=utf-8");
if (isset($_POST['action']) && $_POST['action'] == 'login')
$uname = $_POST['username'];
$pass = $_POST['password'];
$sql = "SELECT * FROM loginajax WHERE username='$uname' AND password='$pass'";
$rs=$conn->query($sql);
if (mysqli_num_rows($rs) <= 0)
echo "0";
else
echo "1";
else echo "this is not Login";
?>
【问题讨论】:
您可以使用浏览器开发工具找出实际返回的标头吗?笼统地说:允许从所有域登录不是一个好主意,这会使您容易受到 CSRF 之类的攻击(标准验证令牌防御要求浏览器不允许跨源请求)。 您的服务器提供预检请求。 PHP 由服务器渲染。您必须从服务器引擎本身返回标头。 【参考方案1】:删除这个:
headers: "Access-Control-Allow-Headers": "Content-Type",
来自您的 jQuery.ajax 调用。
服务器以Access-Control-Allow-Headers
标头响应,客户端不会将其发送到服务器。
客户端发送Access-Control-Request-Headers
以请求允许某些标头,服务器以Access-Control-Allow-Headers
响应,其中列出了其将允许的实际标头。客户端不会要求允许哪些标头。
【讨论】:
请求头消失了,但我没有收到来自服务器的任何答复 @Anahoua16,将错误回调添加到您的 ajax 选项,即error:function()
并查看它是否被触发,如果是,则记录传递的状态/错误
状态:200 textStatus: parsererror errorThrown: SyntaxError: Unexpected token s
现在它正在工作,我正在输入 echo $_SERVER['REQUEST_METHOD'];调试,当我删除它时一切正常,谢谢以上是关于预检响应中的 Access-Control-Allow-Headers 不允许请求标头字段 Access-Control-Allow-Headers的主要内容,如果未能解决你的问题,请参考以下文章
预检响应没有 HTTP ok 状态。 Angular 6 中的 403
OAuth 中的 CORS:对预检请求的响应未通过访问控制检查
预检响应中的 Access-Control-Allow-Headers 不允许授权
预检响应中的 Access-Control-Allow-Headers 不允许请求标头字段内容类型