symfony2 REST,AngularJs访问控制允许原点

symfony2 REST,AngularJs访问控制允许原点,angularjs,rest,symfony,Angularjs,Rest,Symfony,好吧,我绝望了。我用的是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:/

好吧,我绝望了。我用的是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
你知道它怎么了吗


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

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

我对NelmioCorsBundle也有类似的问题,我通过以下设置解决了这个问题:

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

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

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

我不会让自己太复杂,使用我无法控制的第三方插件。希望这能有所帮助,symfony cookbook()中记录了这一点。

对我来说,问题出在网络中……我想。。。我正在用手机创建一个热点。。。然后在笔记本电脑(连接到这个热点)上运行服务器,我试图通过手机访问这个服务器


因为几天后,我刚刚安装了路由器,CORS不再出现问题。

allow_headers:“*”
解决了我的问题:

nelmio_cors:
    paths:
        '^/api/':
            ...
            allow_headers: '*'
            ...
对我来说,错误被记录为NelmioCorsBundle抛出的
未经授权的标题内容类型
。(我使用的是标准的Angular$resource+Symfony+
NelmioCorsBundle
setup)

默认情况下,NelmioCorsBundle只允许
'accept'
'accept-language'
'content-language'
'origin'
(请参阅)

此处抛出错误:

--


PS:请注意允许任何来源(
*

可能会打开的安全漏洞。我们在这里犯的最常见错误是,我们不匹配客户端和服务器端的方法类型。确保在angularjs和symfony route中方法类型都为“POST”

您是否尝试更改nelmio配置?从nelmio网站上可以看到:“allow_origin和allow_headers可以设置为*以接受任何值,但必须显式列出允许的方法。路径必须至少包含一项。”因此,您可能只启用了X-Custom-Auth头?
访问控制允许原点
头在服务器响应中确实不存在。您必须在
上设置
访问控制允许原点
头http://IP/app_dev.php/api/v1/pages.json
服务器。您可以在
PHP
.htaccess
中执行此操作。另外,签入飞行前请求的开发人员工具已成功。@请检查我的答案
nelmio_cors:
    paths:
        '^/api/':
            ...
            allow_headers: '*'
            ...