Symfony2 REST, AngularJs access-Control-Allow-Origin

ладно, я в отчаянии. Я использую FOSRestBundle и NelmioCorsBundle

Я все еще получаю эту ошибку, когда пытаюсь отправить данные с помощью angular с другого сервера:

XMLHttpRequest cannot load 
http://IP/app_dev.php/api/v1/pages.json. 
No 'Access-    Control-Allow-Origin' header is present on the requested resource.
Origin      'http://127.0.0.1:9000' is therefore not allowed access.



Remote Address:IP:80
Request URL:http://IP/app_dev.php/api/v1/pages.json
Request Method:OPTIONS
Status Code:200 OK
Request Headers
Accept:*/*
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8,sk;q=0.6,cs;q=0.4
Access-Control-Request-Headers:accept, authorization, content-type
Access-Control-Request-Method:POST
Cache-Control:no-cache
Connection:keep-alive
Host:192.168.43.195
Origin:http://127.0.0.1:9000
Pragma:no-cache
Referer:http://127.0.0.1:9000/
User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.116 Safari/537.36

Response Headers
Access-Control-Allow-Headers:X-Requested-With, content-type
Access-Control-Allow-Methods:POST, GET, PUT, DELETE, OPTIONS
Connection:Keep-Alive
Content-Length:573
Content-Type:text/html; charset=iso-8859-1
Date:Sun, 29 Jun 2014 18:07:54 GMT
Keep-Alive:timeout=5, max=100
Server:Apache/2.4.7 (Ubuntu)

Я пытаюсь исправить это в течение всего дня...

В настоящее время у меня есть:

# CORS OPTIONS (add this too)
RewriteCond %{REQUEST_METHOD} OPTIONS
RewriteRule ^(.*)$ $1 [R=200,L]

<IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "*"
    Header always set Access-Control-Allow-Methods "POST, GET, PUT, DELETE, OPTIONS"
    Header always set Access-Control-Allow-Headers "X-Requested-With, content-type"
</IfModule>

nelmio_cors:
    paths:
        '^/api/':
            allow_origin: ['*']
            allow_headers: ['X-Custom-Auth']
            allow_methods: ['POST', 'PUT', 'GET', 'DELETE','OPTIONS']
            max_age: 3600

Отправка как:

            var data = new FormData;
            data.append('title', 'title');
            data.append('body', 'body');

            var request = $http({
                method: 'POST',
                url: TB+"/app_dev.php/api/v1/pages.json",
                headers: {
                    'Authorization': 'Bearer '+User.getAccessToken(),
                    'Content-Type': 'application/json'
                },
                data: data
            });

Есть идеи, что с ним не так?

screenshot from 2014-06-29 20 20 01

Ответ 1

Для меня проблема была в сети как-то... Я думаю... Я создавал горячую точку с мобильного... тогда на ноутбуке (подключенном к этой точке доступа) работал сервер и с мобильного я пытался получить доступ этот сервер.

Потому что через несколько дней я просто установил маршрутизатор и не стал больше проблем с CORS.

Ответ 2

У меня была аналогичная проблема с NelmioCorsBundle, я решил с этими настройками:

nelmio_cors:
    paths:
        '^/api/':
            allow_origin: ['*']
            allow_headers: ['*']
            allow_methods: ['POST', 'PUT', 'GET', 'DELETE','OPTIONS']
            max_age: 3600

Ответ 3

Если вы используете хром, вам лучше понять, как он работает на localhost ip. общий подход заключается в том, чтобы отменить прокси-сервер localhost в пользовательский локальный домен, например your-domain.com(для этого вам нужно будет использовать веб-сервер, например apache или nginx), обратный прокси-сервер всех подключений к вашему 127.0.0.1:9000 ip, псевдоним в /etc/hosts для 127.0.1.1 your-domain.com и просто прочитайте документацию по symfony для добавления пользовательских заголовков в ваш запрос ajax. я предполагаю, что у вас есть ваши маршруты ajax, связанные с контроллером, общий пример будет возвращать массив заголовков в качестве третьего параметра

return new Response($json, 201, array('Access-Control-Allow-Origin' => '*', 'Content-Type' => 'application/json'));

Я бы не усложнил себя и не использовал сторонние плагины, над которыми я не контролирую. надеюсь, что это поможет, он задокументирован в кулинарной книге symfony (http://symfony.com/doc/current/book/http_fundamentals.html)

Ответ 4

allow_headers: '*' решил мою проблему:

nelmio_cors:
    paths:
        '^/api/':
            ...
            allow_headers: '*'
            ...

Для меня ошибка была зарегистрирована как Unauthorized header content-type, выведенная NelmioCorsBundle. (Я использую стандартный Angular $resource + Symfony + NelmioCorsBundle setup)

NelmioCorsBundle по умолчанию допускает 'accept', 'accept-language', 'content-language' и 'origin' (см. https://github.com/nelmio/NelmioCorsBundle/blob/1.4.0/EventListener/CorsListener.php#L32)

Ошибка здесь: https://github.com/nelmio/NelmioCorsBundle/blob/1.4.0/EventListener/CorsListener.php#L158

-

PS: помните о дыре безопасности, которое вы можете открыть, разрешая любое происхождение (*)

Ответ 5

Чтобы получить доступ к ресурсам на другом сервере, этот сервер должен объявить заголовок Access-Control-Allow-Origin в ответ или он не будет работать из-за политик безопасности браузера. Похоже, вы не загружаете Nelmio в приложение Simfony.

public function registerBundles()
{
    $bundles = array(
        ...
        new Nelmio\CorsBundle\NelmioCorsBundle(),
        ...
    );
    ...
} 

Ответ 6

Самая распространенная ошибка, которую мы здесь делаем, заключается в том, что мы не учитываем тип метода на стороне клиента и на стороне сервера. Удостоверьтесь, что у вас есть тип метода как "POST" как в режиме angularjs, так и в symfony..!!!