【问题标题】:Passing Values from Javascript to PHP via XMLHttpRequests通过 XMLHttpRequests 将值从 Javascript 传递到 PHP
【发布时间】:2014-10-03 01:14:23
【问题描述】:

我正在尝试将从用户输入收集的一些数据从 javascript 表单发送到 php 文件进行处理。我可以在硬编码 php 值并且只发送不带参数的情况下完成这一壮举,就像这样......

xhr.open("post", "http://host/path/script.php", true);
xhr.send();

但是一旦我尝试发送带有这样的用户输入值的数组...

xhr.open("post", "http://host/path/script.php", true);
xhr.send(data);

我得到一个“未定义的错误”,不太清楚为什么。该变量的类型是“FormData”,我真的不认为这个问题与变量本身有任何关系,只是不确定为什么它没有参数但与数据参数无关。

为了排除同源策略问题,我的 php 文件中有这些标头...

header('Access-Control-Allow-Origin: *');
header("Access-Control-Allow-Credentials: true");
header('Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS');
header('Access-Control-Max-Age: 1000');
header('Access-Control-Allow-Headers: Content-Type, Content-Range, Content-Disposition, Content-Description, X-Request-With');

不过,我对此很陌生,所以这里可能有问题。

编辑:控制台确实给了我这个错误......

XMLHttpRequest cannot load http://host/path/script.php. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://javascripthost/path' is therefore not allowed access. 

看来存在访问控制问题...但我不知道如何解决它

编辑 2:添加标题以防此信息有帮助...

Remote Address:127.0.0.1:80
Request URL:http://host/path/script.php
Request Method:OPTIONS
Status Code:200 OK
Request Headers
Accept:*/*
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-GB,en-US;q=0.8,en;q=0.6
Access-Control-Request-Headers:content-type
Access-Control-Request-Method:POST
Connection:keep-alive
Host:localhost
Origin:http://host2
Referer:http://host2/script
User-Agent:Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 Safari/537.36
Response Headers
Allow:OPTIONS, TRACE, GET, HEAD, POST
Content-Length:0
Date:Thu, 02 Oct 2014 14:08:24 GMT
Public:OPTIONS, TRACE, GET, HEAD, POST
Server:Microsoft-IIS/8.5
X-Powered-By:ASP.NET

【问题讨论】:

  • 你是如何构建data的?你得到什么错误信息?从哪条线?查看开发人员工具的“网络”选项卡。你看到你期望的请求了吗?它的格式是否符合您的预期?是 POST 请求吗?反应如何?
  • 查看您提出的请求。我推测您正在触发预检 OPTIONS 请求,而不是在服务器上处理它。
  • 我认为您可能对 OPTIONS 请求是正确的...在“网络”选项卡中,该方法说 OPTIONS not POST...但我不确定我做错了什么?我指定 post...我不知道预检 OPTIONS 请求是什么
  • 感谢您的链接...我仍然对如何处理预检 OPTIONS 请求感到有些困惑。当我查看网络选项卡时,我只看到“内容类型”作为请求标头

标签: php post xmlhttprequest


【解决方案1】:

解决我的问题的方法是使用 IIS 中的 PHP 脚本将 Access-Control-Allow-Origins 标头添加到我的实际站点。我以为我可以在 PHP 文件中做到这一点,但显然不行。希望这对遇到类似问题的人有所帮助。

附带说明,如果您不使用进度条,通常可以避免处理预检 OPTION 请求。出于某种原因,似乎所有(或我测试过的所有)浏览器都将带有进度条的请求作为预检 OPTION 请求处理。

【讨论】:

    【解决方案2】:

    很可能您没有使用正确的属性。在尝试发送 POST 数据时,通常要确保您的拼写是否正确。

        var data = "username="+username+"&country="+country;
        xmlhttp.open('POST', 'inc/ajaxPostHandler.php', true);
        xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
        xmlhttp.send(data);
    

    【讨论】:

    • 我的 FormData 变量似乎正确存储了所需的值
    • @mgrenier 你要发帖到另一个域吗?
    • @Contax — 查看问题和问题上的 cmets。
    • 有可能,您只需要允许这些域。因此我的 php 文件中的这个标题......“标题('Access-Control-Allow-Origin:*');”如果您阅读自己的链接,则页面上有一个链接绕过同源政策
    猜你喜欢
    • 2012-06-23
    • 2013-01-06
    • 1970-01-01
    • 1970-01-01
    • 2017-01-17
    • 2014-03-15
    • 2016-07-22
    • 1970-01-01
    • 2017-01-09
    相关资源
    最近更新 更多