预检响应中的 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 不允许请求标头字段内容类型

预检响应中的 Access-Control-Allow-Header 中的允许请求标头字段

预检响应中的 Access-Control-Allow-Methods 不允许方法 PATCH