PHP/Symfony API 的 CORS 问题 Nelmio

Posted

技术标签:

【中文标题】PHP/Symfony API 的 CORS 问题 Nelmio【英文标题】:CORS Issue with PHP/Symfony API Nelmio 【发布时间】:2019-08-28 22:13:24 【问题描述】:

从我的 React 应用程序(在端口 3100 上运行)到我的 API(在同一台机器上,但我假设使用不同的端口,无论 Symfony、Nelmio、php 的默认端口)的所有调用都会导致以下结果:

Failed to load https://beta-api.fitchek.com/v1/oauth/login: 
Response to preflight request doesn't pass access control check: 
No 'Access-Control-Allow-Origin' header is present on the 
requested resource. Origin 'https://beta-wellness.fitchek.com' is 
therefore not allowed access. If an opaque response serves your 
needs, set the request's mode to 'no-cors' to fetch the resource 
with CORS disabled.

我已经搜索了 Stack Overflow 和其他网站以了解配置问题可能是什么,但找不到任何有用的信息。我什至尝试在我的 nginx conf 中添加一些广泛开放的 CORS 配置,但结果没有差异。

我的配置如下:

config.yml(用于 Symfony 和 Nelmio):

nelmio_cors:
    defaults:
        allow_credentials: true
        allow_origin: []
        allow_headers: []
        allow_methods: []
        expose_headers: []
        max_age: 0
        hosts: []
        origin_regex: false
    paths:
        '^/':
            allow_credentials: true
            allow_origin: ['*']
            allow_headers: ['content-type', 'authorization']
            allow_methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS']
            max_age: 3600

parameters.yml(用于环境):

    allow_origin_list:
        - 'https://beta-app.fitchek.com'
        - 'https://beta-marketplace.fitchek.com'
        - 'https://beta-canfitpro.fitchek.com'
        - 'https://beta-sweateq.fitchek.com'
        - 'https://beta-payments.fitchek.com'
        - 'https://beta-wellness.fitchek.com'

我的 nginx 配置

user www-data;
worker_processes auto;
pid /run/nginx.pid;

events 
        worker_connections 768;
        # multi_accept on;


http 

        ##
        # Basic Settings
        ##

        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;
        keepalive_timeout 65;
        types_hash_max_size 2048;
        # server_tokens off;

        # server_names_hash_bucket_size 64;
        # server_name_in_redirect off;

        include /etc/nginx/mime.types;
        default_type application/octet-stream;

        ##
        # SSL Settings
        ##
        ssl_protocols               TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers   on;
        ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DHE+AES128:!ADH:!AECDH:!MD5;
        ssl_session_cache shared:SSL:20m;
        ssl_session_timeout 180m;
        add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

        ##
        # Logging Settings
        ##

        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;

        ##
        # Max file upload
        ##

        client_max_body_size 10m;
        client_body_timeout 60s;
        ##
        # Gzip Settings
        ##

        gzip on;
        gzip_disable "msie6";

        # gzip_vary on;
        # gzip_proxied any;
        # gzip_comp_level 6;
        # gzip_buffers 16 8k;
        # gzip_http_version 1.1;
        # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

        ##
        # Virtual Host Configs
        ##

        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;

已编辑

我在我的 Nginx 日志或 php 日志中看不到任何错误。我不知道我还会在哪里查找相关错误,PHP API 中的 dev 或 prod 日志中也没有出现任何内容。

(当我使用 Postman 从本地主机调用 beta 服务器时,不会出现 CORS 错误并且调用工作正常!但是,当从 beta 服务器调用 beta 服务器时,CORS 错误为上面提到的出现)。

【问题讨论】:

我猜不同的端口,不同的起源。 你能发布 Symfony 和 nelmio/cors-bundle 的版本吗? Symfony 3.3.*,Nelmio ^1.4 @ToyRobotic,是不同的端口,但问题似乎是服务器的响应没有“Access-Control-Allow-Origin”标头,我不知道为什么这个标头鉴于上面发布的配置,丢失了 另外,当我从本地开发环境运行应用程序和 API 时,Access-Control-Allow-Origin 标头会显示正确的值。只有当我移动到 beta 服务器进行测试时,标题才会消失 【参考方案1】:

感谢您的帮助,我在我的 API nginx 配置文件中找到了答案。由于某种原因,将标题添加到 OPTIONS 调用的行被注释掉了。取消注释它会使 OPTIONS 调用成功并处理 CORS 问题。

【讨论】:

以上是关于PHP/Symfony API 的 CORS 问题 Nelmio的主要内容,如果未能解决你的问题,请参考以下文章

CSRF 和 RESTful API (symfony2, php)

AWS API Gateway API 密钥与 Cors

PHP/Symfony 的图形仪表板?

owin cors 或 web api cors

API 网关 CORS 问题

解决 API 开发中遇到的 CORS 问题