AngularJS: служба $http GET на php-сервер: метод запроса: ОПЦИИ, код состояния: метод 405 не разрешен

Я борюсь с этой проблемой уже много часов... :-(

Мое приложение angular, обслуживаемое grunt, отправляет запрос $http GET к простой службе PHP на том же хосте (apache), чтобы получить список людей. В результате я получаю запрос 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 framework, так что это файл "index.php", который обслуживает запросы "/api/persons/..." через .htaccess: "... RewriteRule ^( .)$ index.php [QSA,L]"...*)

И это (грустный :-() результат, который я получаю:

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, но без лучших результатов...

Если я забыл какие-либо детали, пожалуйста, просто спросите...

Любая подсказка?


person MarcoS    schedule 30.01.2015    source источник


Ответы (1)


Предварительная проверка CORS обязательна для междоменного запроса.

Вызов OPTIONS фактически возвращает список доступных методов (GET, POST и т. д.).

Вы должны разрешить вызов OPTIONS на вашем php-сервере:

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

См. там CORS не работает php

person Boris Charpentier    schedule 30.01.2015
comment
ОТЛИЧНЫЙ! СПАСИБО!!! Я люблю тебя, чувак :-) Ссылка, которую ты дал, спасла мой день... Но предварительная проверка CORS обязательна даже для запросов GET? Мне нужно снова прочитать спецификации CORS... :-( - person MarcoS; 30.01.2015
comment
:) Я тоже не уверен, что это обязательно, но, возможно, это зависит от клиента, отправляющего запрос. - person Boris Charpentier; 30.01.2015