AngularJS:$http 服务 GET 到 php 服务器:请求方法:选项,状态代码:405 方法不允许

Posted

技术标签:

【中文标题】AngularJS:$http 服务 GET 到 php 服务器:请求方法:选项,状态代码:405 方法不允许【英文标题】:AngularJS: $http service GET to php server: Request Method:OPTIONS, Status Code: 405 Method Not Allowed 【发布时间】:2015-03-29 21:38:06 【问题描述】:

我已经为这个问题苦苦挣扎了好几个小时... :-(

我的 grunt-served angular 应用程序向同一主机 (apache) 上的简单 php 服务发出 $http GET 请求,以获取人员列表。我得到的结果是一个 OPTIONS 请求(???),它得到一个 405 响应......但是为什么 OPTIONS 飞行前请求在 GET 之前???

这些是我的设置的详细信息:

Grunt 配置 Gruntfile.js

grunt.initConfig(
  ...
  connect: 
    options: 
      port: 9000,
      hostname: '0.0.0.0',
      livereload: 35729
    ,
  ,
  ...

Angular 服务persons.js

app.service('Persons', function($http) 
  ...
  return(
    getPersons: function () 
      return $http(
        method: 'get',
        url: http://192.168.1.1/myapp/api/persons/get',
      ).then(handleSuccess, handleError);
    ,
    ...
  );
  ...

文件/api/persons/get/index.php

...
header("Access-Control-Allow-Origin", "http://192.168.1.1:9000");
header("Access-Control-Allow-Methods", "Cache-Control, Pragma, Origin, Authorization, Content-Type, X-Requested-With");
header("Access-Control-Allow-Headers", "GET, PUT, POST, OPTIONS, DELETE, X-XSRF-TOKEN");
echo json_encode($persons);

(事实上,服务器端我使用 Slim 框架,所以这是“index.php”文件,它通过 .htaccess 服务“/api/persons/...”请求:“... RewriteRule ^(.)$ index.php [QSA,L]"...*)

这是我得到的 (sad :-() 结果:

Remote Address:192.168.1.1:80
Request URL:http://192.168.1.1/myapp/api/persons/get
Request Method:OPTIONS
Status Code:405 Method Not Allowed
Request Headersview source
Accept:*/*
Accept-Encoding:gzip, deflate, sdch
Accept-Language:en-US,en;q=0.8,it-IT;q=0.6,it;q=0.4,tr;q=0.2,de;q=0.2
Access-Control-Request-Headers:accept, authorization
Access-Control-Request-Method:GET
Cache-Control:no-cache
Connection:keep-alive
Host:192.168.1.1
Origin:http://192.168.1.1:9000
Pragma:no-cache
Referer:http://192.168.1.1:9000/
User-Agent:Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/40.0.2214.93 Safari/537.36
Response Headersview source
Allow:GET HEAD
Connection:close
Content-Length:0
Content-Type:text/html;charset=UTF-8
Date:Fri, 30 Jan 2015 11:36:43 GMT
Server:Apache/2.2.15 (CentOS)
Set-Cookie:PHPSESSID=a5dbcfa18fcb64a29dbad999c6811d69; path=/
Set-Cookie:a5dbcfa18fcb64a29dbad999c6811d69=DEFAULT%7C0%7C2M3TMlgUx3gTlaarYzHIdD28l8q9FTcNubt55%2BUGpAo%3D%7C7456bf61db3500c8bb7b3bc38082a470ce4a2ad3; path=/
X-Powered-By:PHP/5.6.4

我也尝试过使用grunt-connect-proxy,但没有更好的结果...

如果我忘记了任何细节,请尽管问...

有什么线索吗?

【问题讨论】:

【参考方案1】:

跨域请求必须进行 CORS 预检。

OPTIONS 调用实际上返回可用方法(GET、POST 等)的列表。

你应该在你的 php 后端允许 OPTIONS 调用:

header('Access-Control-Allow-Methods: POST, GET, OPTIONS');

见CORS not working php

【讨论】:

太棒了!谢谢!!!我爱你,伙计 :-) 你提供的链接拯救了我的一天......但是,即使对于 GET 请求,CORS 预检也是强制性的?我必须再次阅读 CORS 规范... :-( :) 我也不确定这是否是强制性的,但可能取决于发送请求的客户端。

以上是关于AngularJS:$http 服务 GET 到 php 服务器:请求方法:选项,状态代码:405 方法不允许的主要内容,如果未能解决你的问题,请参考以下文章

如何在 AngularJS 中从 $http.get 返回图像

如何在 AngularJS 中使用 $http.get 从 jsp 页面获取响应?

AngularJS - $http get 返回状态为 0 的错误?

AngularJS XMLHttpRequest

如何从AngularJS获得响应$ http.get()。then()

$ http get不会在AngularJS中抛出成功或错误[重复]