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..!!!