首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >jQuery $ .ajax(),$ .post在Firefox中发送“OPTIONS”作为REQUEST_METHOD?

jQuery $ .ajax(),$ .post在Firefox中发送“OPTIONS”作为REQUEST_METHOD?
EN

Stack Overflow用户
提问于 2018-01-27 01:58:21
回答 10查看 0关注 0票数 0

我认为jQuery插件有问题..。

插件应该通过ajax从php脚本中获取数据,以将选项添加到<select>.这个Ajax请求是通用的:

代码语言:javascript
复制
$.ajax({
  url: o.url,
  type: 'post',
  contentType: "application/x-www-form-urlencoded",
  data: '{"method":"getStates", "program":"EXPLORE"}',
  success: function (data, status) {
    console.log("Success!!");
    console.log(data);
    console.log(status);
  },
  error: function (xhr, desc, err) {
    console.log(xhr);
    console.log("Desc: " + desc + "\nErr:" + err);
  }
});

这在Safari中没问题,不过在Firefox 3.5中服务端的请求类型总是 OPTIONS ,而且 $_POST 数据也没有。Apache将请求记录为“OPTIONS”类型:

代码语言:javascript
复制
::1 - - [08/Jul/2009:11:43:27 -0500] "OPTIONS sitecodes.php HTTP/1.1" 200 46

为什么这个Ajax调用能在Safari中工作,而在Firefox中却不能工作,我如何去修复它?

代码语言:javascript
复制
Response Headers
Date: Wed, 08 Jul 2009 21:22:17 GMT
Server:Apache/2.0.59 (Unix) PHP/5.2.6 DAV/2
X-Powered-By: PHP/5.2.6
Content-Length  46
Keep-Alive  timeout=15, max=100
Connection  Keep-Alive
Content-Type    text/html

Request Headers
Host    orderform:8888
User-Agent  Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1) Gecko/20090624 Firefox/3.5
Accept  text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language en-us,en;q=0.5
Accept-Encoding gzip,deflate
Accept-Charset  ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive  300
Connection  keep-alive
Origin  http://ux.inetu.act.org
Access-Control-Request-Method   POST
Access-Control-Request-Headers  x-requested-with

下面是Firebug输出的图片:

EN

回答 10

Stack Overflow用户

发布于 2018-01-27 02:09:50

产生错误的原因是同源策略,它只允许自己的域执行XMLHTTPRequest。看看能否使用JSONP回调:

代码语言:javascript
复制
$.getJSON( 'http://<url>/api.php?callback=?', function ( data ) { alert ( data ); } );
票数 0
EN

Stack Overflow用户

发布于 2018-01-27 03:20:10

我在Django端使用了以下代码来解释选项请求并设置所需的访问控制头。在此之后,我来自Firefox的跨域请求开始工作。如前所述,浏览器首先发送OPTIONS请求,然后立即发送POST/GET

代码语言:javascript
复制
def send_data(request):
    if request.method == "OPTIONS": 
        response = HttpResponse()
        response['Access-Control-Allow-Origin'] = '*'
        response['Access-Control-Allow-Methods'] = 'POST, GET, OPTIONS'
        response['Access-Control-Max-Age'] = 1000
        # note that '*' is not valid for Access-Control-Allow-Headers
        response['Access-Control-Allow-Headers'] = 'origin, x-csrftoken, content-type, accept'
        return response
    if request.method == "POST":
        # ... 

编辑:至少在某些情况下,您还需要向实际响应中添加相同的访问控制头。这可能有点混乱,因为请求似乎成功了,但是Firefox没有将响应的内容传递给Javascript。

票数 0
EN

Stack Overflow用户

发布于 2018-01-27 04:52:03

Mozilla开发者中心文章描述各种跨域请求方案。文章指出,内容类型为“application/x-www-form-urlencode”的POST请求应该作为“简单请求”simple request“(没有“preflight”OPTIONS请求)。然而,我发现Firefox发送了OPTIONS请求,尽管我的帖子是以POST发送的。

我在服务器上创建了一个选项请求处理程序,将“Access-Control-Allow-Origin”响应头设置为“*‘.通过将其设置为特定的东西,可以限制得更多,比如’http://omeurl.com 你可以指定一个以逗号分隔的多个来源的列表,但我无法让它起作用。

一旦Firefox接收到具有可接受的“Access-Control-Allow-Origin”值的选项请求响应,它就会发送POST请求。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100007249

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档