为什么我的$ .ajax显示“预检是无效的重定向错误”?

时间:2015-11-11 06:45:15

标签: javascript jquery ajax

我在Postman中尝试了以下代码并且它正常运行。代码有问题吗?

$.ajax({
   url: 'http://api.example.com/users/get',
   type: 'POST',
   headers: {
      'name-api-key':'ewf45r4435trge',
   },
   data: {
      'uid':36,
   },
   success: function(data) {
      console.log(data);
   }
});

我在控制台中收到如下错误,请告知。

  

XMLHttpRequest无法加载http://api.example.com/users/get响应   预检无效(重定向)

8 个答案:

答案 0 :(得分:32)

当我尝试将https网络服务称为http webservice时,我收到了同样的错误。

e.g when I call url 'http://api.example.com/users/get'
which should be 'https://api.example.com/users/get'

当您尝试呼叫http而不是https时,由于重定向状态302而产生此错误。

答案 1 :(得分:24)

This answer完全相同(虽然对于角度) - 这是一个CORS问题。

一个快速解决方法是通过指定一个' Content-Type' 标题值来修改每个POST请求,这些值不会触发"预检"。这些类型是:

  • 应用程序/ x-WWW窗体-urlencoded
  • 的multipart / form-data的
  • 文本/纯

ANYTHING ELSE触发预检。

例如:

$.ajax({
   url: 'http://api.example.com/users/get',
   type: 'POST',
   headers: {
      'name-api-key':'ewf45r4435trge',
      'Content-Type':'application/x-www-form-urlencoded'
   },
   data: {
      'uid':36,
   },
   success: function(data) {
      console.log(data);
   }
});

答案 2 :(得分:6)

错误表明预检正在获得重定向响应。这可能由于多种原因而发生。 找出你被重定向到哪里以寻找它为什么会发生的线索。检查开发人员工具中的网络选项卡。

正如@Peter T所提到的,一个原因是API可能需要HTTPS连接而不是HTTP,并且所有通过HTTP的请求都会被重定向。 Location响应返回的302标头会说同一个网址http在这种情况下更改为https

另一个原因可能是您的身份验证令牌未被发送或不正确。大多数服务器都设置为将所有不包含身份验证令牌的请求重定向到登录页面。再次,检查您的Location标题,看看这是否是您要发送的地方,并查看确保浏览器发送带有请求的身份验证令牌。

通常,服务器将配置为始终将不具有身份验证令牌的请求重定向到登录页面 - 包括您的预检/ OPTIONS请求。这是个问题。更改服务器配置以允许来自未经身份验证的用户的OPTIONS请求。

答案 3 :(得分:5)

请在标头中设置http内容类型,并确保服务器正在验证CORS。这是如何在PHP中完成的:

//NOT A TESTED CODE
header('Content-Type: application/json;charset=UTF-8');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: DELETE, HEAD, GET, OPTIONS, POST, PUT');
header('Access-Control-Allow-Headers: Content-Type, Content-Range, Content-Disposition, Content-Description');
header('Access-Control-Max-Age: 1728000');

请参阅:

http://www.w3.org/TR/cors/#cross-origin-request-with-preflight-0

How does Access-Control-Allow-Origin header work?

答案 4 :(得分:5)

我的问题是POST请求需要尾随斜杠'/'。

答案 5 :(得分:4)

我遇到了同样的问题,它让我保持了好几天。最后,我意识到指向应用程序的URL完全错误。 例如:

URL: 'http://api.example.com/'
URL: 'https://api.example.com/'.

如果是http或https验证。
检查重定向URL并确保它与您传递的内容相同。

答案 6 :(得分:3)

我遇到了同样的错误,但问题是我在网址中输了一个错误

url: 'http://api.example.com/TYPO'

API有一个重定向到另一个域的所有URL错误(404错误)。

因此,将拼写错误修改为正确的URL会为我修复。

答案 7 :(得分:0)

我的问题是由@ehacinom的完全相反引起的。我的Laravel生成的API不喜欢POST请求中的尾随“ /”。在localhost上工作正常,但上传到服务器后不起作用。