symfony2 REST,AngularJs access-Control-Allow-Origin

时间:2014-06-30 20:21:02

标签: angularjs rest symfony

好吧,我很绝望。我正在使用FOSRestBundle和NelmioCorsBundle

当我尝试通过不同服务器的角度发布数据时,我仍然收到此错误:

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

6 个答案:

答案 0 :(得分:10)

我和NelmioCorsBundle有类似的问题,我解决了这个设置:

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

答案 1 :(得分:4)

如果你正在使用chrome,你应该更好地考虑在localhost ip上工作。一种常见的方法是将localhost反向代理到像your-domain.com这样的自定义本地域(为此你必须使用像apache或nginx这样的web服务器),反向代理到你的127.0.0.1:9000 ip的所有连接,有127.0.1.1 your-domain.com的/ etc / hosts中的别名,只需阅读symfony文档,即可将自定义标头添加到ajax请求中。我假设你有你的ajax路由连接到控制器,一个常见的例子是返回一个标头数组作为第三个参数

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

我不会让自己复杂化并使用我无法控制的第三方插件。希望这会有所帮助,它已在symfony cookbook中记录(http://symfony.com/doc/current/book/http_fundamentals.html

答案 2 :(得分:1)

allow_headers: '*'解决了我的问题:

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

对我来说,错误记录为NelmioCorsBundle抛出的Unauthorized header content-type。 (我使用标准的Angular $ resource + Symfony + NelmioCorsBundle设置)

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:请注意允许任何来源(*

打开的安全漏洞

答案 3 :(得分:0)

要访问其他服务器上的资源,该服务器必须在其响应中声明Access-Control-Allow-Origin标头,否则由于浏览器安全策略而无法正常工作。看起来你没有在你的Simfony应用程序中加载Nelmio。

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

答案 4 :(得分:0)

对我来说,问题出现在网络中......我想...我是从移动设备创建一个热点...然后在笔记本电脑上(连接到这个热点)正在运行服务器而我正试图访问这个服务器。

因为几天之后我只是设置路由器而没有CORS的问题。

答案 5 :(得分:0)

我们在这里做的最常见的错误是我们在客户端和服务器端不匹配方法类型。确保在angularjs和symfony路径中都有方法类型为“POST”.. !!!