我正在尝试将从用户输入收集的一些数据从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
答案 0 :(得分:0)
解决了我的问题是使用IIS中的PHP脚本将Access-Control-Allow-Origins标头添加到我的实际站点。我以为我可以在PHP文件中做到但显然不是。希望这可以帮助任何有类似问题的人。
作为旁注,如果您不使用进度条,通常可以避免处理预检OPTION请求。出于某种原因,似乎所有(或我所有测试过的)浏览器都使用进度条处理请求作为预检OPTION请求。
答案 1 :(得分:-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);