【问题标题】:Request header field Access-Control-Allow-Headers is not allowed by Access-Control-Allow-Headers in preflight response预检响应中的 Access-Control-Allow-Headers 不允许请求标头字段 Access-Control-Allow-Headers
【发布时间】:2016-05-15 21:37:51
【问题描述】:

我正在尝试从跨域创建登录页面但我无法解决问题,错误是:

XMLHttpRequest 无法加载 http://localhost/testing/resp.php。预检响应中的 Access-Control-Allow-Headers 不允许请求标头字段 Access-Control-Allow-Headers。

我的 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 由服务器渲染。您必须从服务器引擎本身返回标头。

标签: javascript php jquery ajax cross-domain


【解决方案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'];调试,当我删除它时一切正常,谢谢
猜你喜欢
  • 2016-04-24
  • 2019-02-21
  • 2017-12-02
  • 1970-01-01
  • 2019-12-12
  • 2018-03-02
  • 1970-01-01
  • 2020-02-27
  • 2016-05-10
相关资源
最近更新 更多