5
votes

Erreurs CORS avec Symfony 4 et Nelmio CORS Bundle

J'ai essayé de comprendre pourquoi je rencontre des problèmes CORS avec mon application API Symfony 4 que je viens de déployer sur mon serveur Apache et je n'ai aucun sens à ce problème.

config / packages / nelmio_cors.yaml

...
CORS_ALLOW_ORIGIN=/*/
...

.env

nelmio_cors:
    defaults:
        origin_regex: true
        allow_origin: ['%env(CORS_ALLOW_ORIGIN)%']
        allow_methods: ['GET', 'OPTIONS', 'POST', 'PUT', 'PATCH', 'DELETE']
        allow_headers: ['Content-Type', 'Authorization']
        max_age: 3600
    paths:
        '^/': ~

Toutes les réponses des demandes que je fais de mon application frontale localhost à cette API ne contiennent pas d'en-tête Access-Control-Allow-Origin et j'obtiens l'erreur standard; p>

Accès à XMLHttpRequest à ' http://my-api.com/foo ' depuis l'origine " http: // localhost: 4200 " a été bloqué par la stratégie CORS: réponse à la demande de contrôle en amont ne passe pas la vérification du contrôle d'accès: Non L'en-tête 'Access-Control-Allow-Origin' est présent sur le demandé ressource.

Aucun en-tête spécial n'est envoyé et pour l'instant j'ai défini l'expression régulière d'origine autorisée sur "all", donc je ne peux pas déterminer ce qui cause le problème ici. J'ai même vérifié dans le cache pour m'assurer que l'origine est correctement extraite des variables env, ce qui est le cas. Si un autre contenu de contexte / fichier est nécessaire pour vous aider, veuillez me le faire savoir!


2 commentaires

Êtes-vous sûr de votre var. CORS_ALLOW_ORIGIN. Avez-vous essayé CORS_ALLOW_ORIGIN = *?


@FlorianHermann la variable est interprétée comme une expression régulière, mais oui j'ai essayé les deux valeurs


4 Réponses :


-3
votes

Pourquoi avez-vous besoin de nelmio?

Vous pouvez avoir un écouteur d'événement simple (sur kernel.event_subscriber ) en ajoutant ces en-têtes.

    app.http_kernel.cors_subscriber:
        class: App\EventListener\HttpKernel\CorsSubscriber
        tags:
            - { name: kernel.event_subscriber }

Enregistrez-le en tant que kernel.event_subscriber

namespace App\EventListener\HttpKernel;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;

class CorsSubscriber implements EventSubscriberInterface
{

    public static function getSubscribedEvents(): array
    {
        return [
            KernelEvents::RESPONSE => 'onResponse'
        ];
    }

    public function onResponse(FilterResponseEvent $filterResponseEvent)
    {
        $response = $filterResponseEvent->getResponse();
        $response->headers->set('Access-Control-Allow-Origin', '*');
    }
}


1 commentaires

Je voudrais être plus restrictif de CORS lors de l'utilisation de l'application plus sérieusement en mode production, pour l'instant j'essaie seulement de confirmer un premier déploiement fonctionnel que je ne peux pas faire même en étant aussi peu restrictif que possible



0
votes

J'essaie toujours d'être un peu plus précis pour autoriser CORS comme:

CORS_ALLOW_ORIGIN=^.*$

ce que vous pourriez essayer si vous voulez vraiment activer toutes les origines serait quelque chose comme:

XXX


0 commentaires

0
votes

Votre problème est que vous avez choisi d'utiliser une expression régulière ( origin_regex: true ) mais que vous n'avez pas fourni de modèle valide.

Si vous souhaitez utiliser origin_regex: true , vous devez spécifier un modèle valide tel que . * ou ^. * $ . < / p>

Si vous ne souhaitez pas utiliser d'expression régulière, omettez le paramètre origin_regex (ou définissez-le sur false ) et utilisez simplement * comme valeur de CORS_ALLOW_ORIGIN .


1 commentaires

Même avec ce changement suggéré, cela ne fait aucune différence, je suppose qu'il y a quelque chose sans rapport qui cause cela, ce qui est bizarre.



0
votes

J'ai résolu le problème, et bien qu'en surface il semble être lié à la configuration CORS, il s'agissait en fait d'une mauvaise configuration du projet sur le serveur.

TL; DR est qu'il manquait au projet un fichier .htaccess dont je n'avais pas besoin lors du développement en raison de l'utilisation de Valet - en suivant les instructions ici a résolu le problème.


2 commentaires

Et quel est le contenu du .htaccess,?


@ALFA c'est dans le lien dans la réponse