Symfony, NelmioCorsBundle et Access Control Allow Origin

Le problème exposé dans ce sujet a été résolu.

Bonjour,

Je m’énerve prodigieusement sur la mise à jour d’un de mes sites. En l’occurrence un site de cuisine mais on s’en moque dans cette histoire. Bref. Je refais tout un site en utilisant Symfony 7, Api Platform, Nelmio Cors Bundle, et tout ce qu’il faut pour faire un joli site. Il fonctionne parfaitement en local, pas la moindre alerte, avertissement, ou erreur, que ce soit en mode dev ou mode prod. Mais, arrivé sur le serveur de mon fournisseur, toutes les requêtes, que ce soit vers l’api pour aller chercher les infos à afficher (via Vue, Axios et tout cet écosystème JS), ou les urls en "dur" comme login/logout ou /admin me sont renvoyées avec un code 404 :

"Blocage d’une requête multi-origines : la politique same origin ne permet pas de consulter la ressource distante située sur "www.mondomaine.fr". Raison : l’en-tête CORS "Access Control Allow Origin" est manquant.

J’avoue très sincèrement que je n’y connais presque rien en serveurs, pas plus qu’en header. Parmi tout ce qu’il y a à connaitre pour faire un site, j’avoue avoir passé peu de temps sur ces sujets et que…ben…ils ne m’intéressent pas plus que ça. Honte sur moi.

J’ai essayé tout un tas de configurations différentes dans le fichier yaml de config du bundle Nelmio, sans aucun changement. Ca prend un temps fou de vider le cache à chaque fois ^^.

J’ai également essayé cette solution sur Github, sans plus de résultat.

On m’a également dit de tester

curl -I -X OPTIONS https://www.mybeautifulsymfonysite.fr/api/tags?isTheStar=true

//qui pour info donne ceci:
HTTP/1.1 200 OK
date: Tue, 26 Nov 2024 08:49:35 GMT
server: Apache
allow: GET,POST,OPTIONS,HEAD
vary: User-Agent
content-length: 0
set-cookie: WEBMO-MNO=11115|Z0WLo|Z0WLo; path=/; HttpOnly; SameSite=Strict

Mais vu que je ne sais pas ce qui est supposé être le bon résultat, ça ne m’avance pas des masses non plus.

Je suis donc coincé, sans aucune idée de la méthode que je pourrais appliquer pour ne serait-ce que progresser dans la compréhension du problème.

Un technicien de mon fournisseur serveur me dit "veuillez noter qu’il est possible de configurer le paramètre Access-Control-Allow-Origin" via un fichier .htaccess : mais là, je me dis que ça me prouve que le serveur n’a pas de paramètre particulier concernant cette histoire et ne réécrit pas les headers ou n’empêche pas NelmioCorsBundle de faire son boulot.

Si quelqu’un pouvait prendre un moment pour m’aiguiller dans la bonne direction, ou ne serait-ce que me donner des pistes à étudier et des méthodes à tester pour finir par comprendre pourquoi j’ai ce problème, j’apprécierais énormément.

Merci.


Pour référence, l’actuelle configuration nelmio yaml:

nelmio_cors:
    defaults:
        origin_regex: true
        allow_origin: [ '*' ]
        allow_methods: [ 'GET', 'OPTIONS', 'POST', 'PUT', 'PATCH', 'DELETE' ]
        allow_headers: [ '*' ]
        expose_headers: [ 'Link' ]
        forced_allow_origin_value: ~
        skip_same_as_origin: true
        max_age: 3600
    paths:
        '^/api/':
            allow_origin: [ '*' ]
            allow_headers: [ '*' ]
            allow_methods: [ 'GET', 'OPTIONS', 'POST', 'PUT', 'PATCH', 'DELETE' ]
            forced_allow_origin_value: ~
            max_age: 3600
        '^/admin/':
            allow_origin: [ '*' ]
            allow_headers: [ '*' ]
            allow_methods: [ 'GET', 'OPTIONS', 'POST', 'PUT', 'PATCH', 'DELETE' ]
            forced_allow_origin_value: ~
            max_age: 3600

Edit : je me dis que la réponse CURL au-dessus ne mentionne pas du tout "get options post put patch delete" comme c’est dit dans la configuration du bundle. Sans doute matière à réfléxion : est-ce que ça veut dire que le serveur réécrit tout ou bien que nelmio déconne chez moi ? Vous voyez quelque chose que je pourrais faire pour trancher la question ? En bonus, je suis prêt à tester la méthode .htaccess, mais à quel endroit de mon arborescence ce fichier doit-il être placé ? Public ? WWW ? Ailleurs ?

Bref pardon pour ce pavé et bonne journée.

+0 -0

Je me réponse à moi-même pour indiquer à un éventuel lecteur ce que je tente : J’ai mis un .htaccess contenant ceci à la racine "public" :

<IfModule mod_headers.c>
   Header set Access-Control-Allow-Origin "https://www.mondomaine.fr"
   Header set Access-Control-Allow-Origin "https://mondomaine.fr"
   Header set Access-Control-Allow-Methods "GET, POST, OPTIONS, PUT, PATCH, DELETE"
   Header set Access-Control-Allow-Headers "Content-Type, Authorization, X-Requested-With"
</IfModule>

Ce qui me donne désormais ceci si je fais le curl du premier message :

HTTP/1.1 200 OK
date: Tue, 26 Nov 2024 09:32:47 GMT
server: Apache
allow: GET,POST,OPTIONS,HEAD
vary: User-Agent
access-control-allow-origin: https://mondomaine.fr
access-control-allow-methods: GET, POST, OPTIONS, PUT, PATCH, DELETE
access-control-allow-headers: Content-Type, Authorization, X-Requested-With
content-length: 0
set-cookie: WEBMO-MNO=11115|Z0WVw|Z0WVw; path=/; HttpOnly; SameSite=Strict

Je remarque une différence entre le www.mondomaine.fr entré dans le curl et le mondomaine.fr (sans www, donc) de la réponse. Je ne sais pas si c’est important. En tout cas ça me fait penser que Nelmio n’en rame pas une dans ma configuration. Hélas, ça ne change rien au résultat, j’ai toujours des 404 partout.

+0 -0

Hello,

Tu ne peux envoyer qu’une seule fois un même header, donc Apache prend la dernière valeur qu’il a : la version sans www.

Le but de cet entête est d’indiquer à client s’il a le droit d’afficher une ressource (image, vidéo, page complète…) dans une autre page qui peut être appartenir à un autre domaine. Plus d’infos : https://developer.mozilla.org/fr/docs/Web/HTTP/Headers/Access-Control-Allow-Origin

En l’occurrence si tu veux autoriser plusieurs domaines tu as deux solutions :

  1. autoriser tous les domaines (y compris ceux que tu ne contrôles pas) avec la valeur *
  2. autoriser dynamiquement un domaine en fonction du domaine actuel (cf. cette réponse sur StackOverflow)

En local ça fonctionne parce que les navigateurs ne contrôlent pas les accès sur localhost ou des IP locales (justement pour faciliter le dev). Mais sur un serveur distant ça devient risqué d’autoriser des pages/scripts externes à charger des ressources sans limite.

Merci pour ton intervention. J’ai mis (stupidement ?) les deux parce que mon site fonctionne théoriquement avec ou sans le www. Bref je me disais qu’il fallait lui indiquer "peu importe si il y a les www ou pas, accepte tout ce qui vient de mondomaine.fr, bordel, j’ai tout bien configuré pour que ça marche". Tout ça ^^ A noter que si je suis sur WWW.mondomaine.fr, le premier api call généré par axios vers "www.mondomaine.fr/api/tags?blabla" renvoie 404 sans rien d’autre. Si je pars depuis mondomaine.fr, j’ai le 404 et l’erreur access allow origin.

Alors la 404 est pas liée à un header mais à autre chose.

Peut-être une config Symfony pour lui indiquer la racine ou quelque chose du genre qui lui permet pas de résoudre le chemin demandé comme il faut, ou le lien entre Apache et Symfony est mal fait. Mais là il faut plus de détails pour savoir de quoi il s’agit.

L’erreur d’origine est liée au fait que tu appelles probablement un domaine depuis l’autre (les deux versions étant des domaines différents du point de vue du navigateur).

Mmmm remarque très intéressante.

J’ai mis à jour mon .htaccess en m’inspirant du lien que tu m’as donné (mais sans changement pour le résultat, hélas) :

<IfModule mod_headers.c>
   SetEnvIf Origin "http(s)?://(www\.)?(domaine.fr)$" AccessControlAllowOrigin=$0$1
   Header add Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin
   Header set Access-Control-Allow-Credentials true
   Header set Access-Control-Allow-Methods "GET, POST, OPTIONS, PUT, PATCH, DELETE"
   Header set Access-Control-Allow-Headers "Content-Type, Authorization, X-Requested-With"
</IfModule>

Qu’est-ce que je peux faire pour obtenir des détails, dans le cas où les headers ne sont en fait pas responsables ? J’aurais laissé quelque part en dur un "localhost" ? Y a-t-il des tests que je peux faire ? En local je n’ai pas d’erreur, et pour le serveur, j’ai peu de paramètres sur lesquels jouer.

Ma configuration de Symfony est très classique, il n’y a pas de bundle exotique, et le plus pénible a été de configurer webpack encore pour utiliser Vue sur le frontend.

Edit : je précise également que les appels vers par exemple google fonts pour les polices ou gsap pour faire de jolies animations, passent, eux. C’est vraiment de mondomaine vers mondomaine que ça bugge, absurdement.

+0 -0

Bon je vais tâcher d’essayer de comprendre tous ces logs et je reviendrai dire si je vois quelque chose de louche :/

Je sens que je vais m’arracher le peu de cheveux qui me restent quand je vais me rendre compte que j’ai oublié genre routes.yaml ou une autre ânerie bien débile.

En tout cas le site sur le serveur charge bien tout ce qui est dans le répertoire public et ses descendants, comme images ou build. Et il va bien chercher des fichiers sur cloudflare ou font.googleapis.com. Bref c’est vraiment dès qu’on sort de www.mondomaine.fr et qu’on fait une requête peu importe laquelle vers www.mondomaine.fr/nimportequoiaprès.

EDIT peut-être important :

je retire ce que j’ai dit, certaines pages fonctionnent, comme www.mondomaine.fr/contact ou /mentions-legales, deux vues sans calls API générées par Vue et VueRouter

EDIT 2

Sur le serveur dans le cache en prod, j’ai un fichier php "url_matching_routes.php" qui après vérification contient bien - il me semble - l’intégralité de mes routes, api compris.

+0 -0

J’ai installé Monolog Bundle mais j’ai un petit souci de configuration :

monolog:
    handlers:
        main:
            type:           rotating_file
            max_files:      3
            path:           "%kernel.logs_dir%/%kernel.environment%.all.log"
            level:          debug

Avec ça, dans le prod.log il n’enregistre quasiment rien. En mode dev (pas recommandé en production mais il faut ce qu’il faut), il enregistre beaucoup plus mais absolument pas les requêtes et erreurs 404. Mmmm…Que faut-il que je configure en plus, s’il vous plait ?

Edit :

Remarque, j’ai peut-être ceci, mais ce n’est pas une erreur bloquante et encore une fois, en local que ce soit en dev ou prod, toute l’app marche farpaitement.

[2024-11-26T18:48:29.257833+01:00] request.INFO: Matched route "app_homepage". {"route":"app_homepage","route_parameters":{"_route":"app_homepage","_controller":"App\\Controller\\PublicController::index"},"request_uri":"https://www.mondomaine.fr/","method":"GET"} []
[2024-11-26T18:48:29.274205+01:00] security.DEBUG: Checking for authenticator support. {"firewall_name":"main","authenticators":1} []
[2024-11-26T18:48:29.275004+01:00] security.DEBUG: Checking support on authenticator. {"firewall_name":"main","authenticator":"Symfony\\Component\\Security\\Http\\Authenticator\\JsonLoginAuthenticator"} []
[2024-11-26T18:48:29.275220+01:00] security.DEBUG: Authenticator does not support the request. {"firewall_name":"main","authenticator":"Symfony\\Component\\Security\\Http\\Authenticator\\JsonLoginAuthenticator"} []

Et ça repart en boucle ensuite.

+0 -0

Donc, côté Serveur Apache, j’ai pu avoir ceci - en attendant d’avoir peut-être plus, j’ai contacté le service client pour voir :

m.o.n.i.p - - [26/Nov/2024:10:22:37 +0100] "GET /api/tags?isTheStar=true HTTP/1.1" 404 196 "https://www.mondomaine.fr/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:132.0) Gecko/20100101 Firefox/132.0" "www.mondomaine.fr"

Toutes les erreurs 404 sont suivies de 196, je ne sais pas encore ce qu’il signifie.

Côté Symfony sur le serveur, mon log dit par exemple ceci (plus long ^^) :

[2024-11-27T15:22:51.775437+01:00] doctrine.DEBUG: Executing statement: SELECT t0.id AS id_1, t0.name AS name_2, t0.slug AS slug_3, t0.type AS type_4, t0.is_the_star AS is_the_star_5, t0.is_useful AS is_useful_6 FROM tag t0 WHERE t0.is_the_star = ? LIMIT 1 (parameters: array{"1":1}, types: array{"1":5}) {"sql":"SELECT t0.id AS id_1, t0.name AS name_2, t0.slug AS slug_3, t0.type AS type_4, t0.is_the_star AS is_the_star_5, t0.is_useful AS is_useful_6 FROM tag t0 WHERE t0.is_the_star = ? LIMIT 1","params":{"1":1},"types":{"1":5}} []
[2024-11-27T15:22:51.931271+01:00] event.DEBUG: Notified event "kernel.response" to listener "Symfony\Component\Security\Http\Firewall\ContextListener::onKernelResponse". {"event":"kernel.response","listener":"Symfony\\Component\\Security\\Http\\Firewall\\ContextListener::onKernelResponse"} []
[2024-11-27T15:22:51.931397+01:00] event.DEBUG: Notified event "kernel.response" to listener "Nelmio\CorsBundle\EventListener\CorsListener::onKernelResponse". {"event":"kernel.response","listener":"Nelmio\\CorsBundle\\EventListener\\CorsListener::onKernelResponse"} []
[2024-11-27T15:22:51.931492+01:00] event.DEBUG: Notified event "kernel.response" to listener "Symfony\Component\HttpKernel\EventListener\ResponseListener::onKernelResponse". {"event":"kernel.response","listener":"Symfony\\Component\\HttpKernel\\EventListener\\ResponseListener::onKernelResponse"} []
[2024-11-27T15:22:51.931573+01:00] event.DEBUG: Notified event "kernel.response" to listener "Symfony\Component\WebLink\EventListener\AddLinkHeaderListener::onKernelResponse". {"event":"kernel.response","listener":"Symfony\\Component\\WebLink\\EventListener\\AddLinkHeaderListener::onKernelResponse"} []
[2024-11-27T15:22:51.931677+01:00] event.DEBUG: Notified event "kernel.response" to listener "Symfony\Component\HttpKernel\DataCollector\RequestDataCollector::onKernelResponse". {"event":"kernel.response","listener":"Symfony\\Component\\HttpKernel\\DataCollector\\RequestDataCollector::onKernelResponse"} []
[2024-11-27T15:22:51.931759+01:00] event.DEBUG: Notified event "kernel.response" to listener "Nelmio\CorsBundle\EventListener\CacheableResponseVaryListener::onResponse". {"event":"kernel.response","listener":"Nelmio\\CorsBundle\\EventListener\\CacheableResponseVaryListener::onResponse"} []
[2024-11-27T15:22:51.931834+01:00] event.DEBUG: Notified event "kernel.response" to listener "Symfony\Component\HttpKernel\EventListener\CacheAttributeListener::onKernelResponse". {"event":"kernel.response","listener":"Symfony\\Component\\HttpKernel\\EventListener\\CacheAttributeListener::onKernelResponse"} []
[2024-11-27T15:22:51.931909+01:00] event.DEBUG: Notified event "kernel.response" to listener "Symfony\Component\HttpKernel\EventListener\ProfilerListener::onKernelResponse". {"event":"kernel.response","listener":"Symfony\\Component\\HttpKernel\\EventListener\\ProfilerListener::onKernelResponse"} []
[2024-11-27T15:22:51.931983+01:00] event.DEBUG: Notified event "kernel.response" to listener "Symfony\Component\HttpKernel\EventListener\ErrorListener::removeCspHeader". {"event":"kernel.response","listener":"Symfony\\Component\\HttpKernel\\EventListener\\ErrorListener::removeCspHeader"} []
[2024-11-27T15:22:51.932056+01:00] event.DEBUG: Notified event "kernel.response" to listener "Symfony\Bundle\WebProfilerBundle\EventListener\WebDebugToolbarListener::onKernelResponse". {"event":"kernel.response","listener":"Symfony\\Bundle\\WebProfilerBundle\\EventListener\\WebDebugToolbarListener::onKernelResponse"} []
[2024-11-27T15:22:51.932130+01:00] event.DEBUG: Notified event "kernel.response" to listener "Symfony\Component\HttpKernel\EventListener\DisallowRobotsIndexingListener::onResponse". {"event":"kernel.response","listener":"Symfony\\Component\\HttpKernel\\EventListener\\DisallowRobotsIndexingListener::onResponse"} []
[2024-11-27T15:22:51.932203+01:00] event.DEBUG: Notified event "kernel.response" to listener "Symfony\Component\HttpKernel\EventListener\SessionListener::onKernelResponse". {"event":"kernel.response","listener":"Symfony\\Component\\HttpKernel\\EventListener\\SessionListener::onKernelResponse"} []
[2024-11-27T15:22:51.936753+01:00] event.DEBUG: Notified event "kernel.finish_request" to listener "Symfony\Component\HttpKernel\EventListener\LocaleListener::onKernelFinishRequest". {"event":"kernel.finish_request","listener":"Symfony\\Component\\HttpKernel\\EventListener\\LocaleListener::onKernelFinishRequest"} []
[2024-11-27T15:22:51.936852+01:00] event.DEBUG: Notified event "kernel.finish_request" to listener "Symfony\Component\HttpKernel\EventListener\RouterListener::onKernelFinishRequest". {"event":"kernel.finish_request","listener":"Symfony\\Component\\HttpKernel\\EventListener\\RouterListener::onKernelFinishRequest"} []
[2024-11-27T15:22:51.936931+01:00] event.DEBUG: Notified event "kernel.finish_request" to listener "Symfony\Bundle\SecurityBundle\Debug\TraceableFirewallListener::onKernelFinishRequest". {"event":"kernel.finish_request","listener":"Symfony\\Bundle\\SecurityBundle\\Debug\\TraceableFirewallListener::onKernelFinishRequest"} []
[2024-11-27T15:22:51.937016+01:00] event.DEBUG: Notified event "kernel.finish_request" to listener "Symfony\WebpackEncoreBundle\EventListener\ResetAssetsEventListener::resetAssets". {"event":"kernel.finish_request","listener":"Symfony\\WebpackEncoreBundle\\EventListener\\ResetAssetsEventListener::resetAssets"} []
[2024-11-27T15:22:51.937093+01:00] event.DEBUG: Notified event "kernel.finish_request" to listener "Symfony\Component\HttpKernel\EventListener\LocaleAwareListener::onKernelFinishRequest". {"event":"kernel.finish_request","listener":"Symfony\\Component\\HttpKernel\\EventListener\\LocaleAwareListener::onKernelFinishRequest"} []
[2024-11-27T15:22:51.968929+01:00] php.INFO: User Deprecated: Method "Symfony\Component\EventDispatcher\EventSubscriberInterface::getSubscribedEvents()" might add "array" as a native return type declaration in the future. Do the same in implementation "App\Listeners\BookmarkUserListener" now to avoid errors or add an explicit @return annotation to suppress this message. {"exception":"[object] (ErrorException(code: 0): User Deprecated: Method \"Symfony\\Component\\EventDispatcher\\EventSubscriberInterface::getSubscribedEvents()\" might add \"array\" as a native return type declaration in the future. Do the same in implementation \"App\\Listeners\\BookmarkUserListener\" now to avoid errors or add an explicit @return annotation to suppress this message. at /home/users5/x/xavmiam/www/miam/vendor/symfony/error-handler/DebugClassLoader.php:341)"} []
[2024-11-27T15:22:51.969695+01:00] php.INFO: User Deprecated: Method "Symfony\Component\EventDispatcher\EventSubscriberInterface::getSubscribedEvents()" might add "array" as a native return type declaration in the future. Do the same in implementation "App\Listeners\RecipeUserListener" now to avoid errors or add an explicit @return annotation to suppress this message. {"exception":"[object] (ErrorException(code: 0): User Deprecated: Method \"Symfony\\Component\\EventDispatcher\\EventSubscriberInterface::getSubscribedEvents()\" might add \"array\" as a native return type declaration in the future. Do the same in implementation \"App\\Listeners\\RecipeUserListener\" now to avoid errors or add an explicit @return annotation to suppress this message. at /home/users5/x/xavmiam/www/miam/vendor/symfony/error-handler/DebugClassLoader.php:341)"} []
[2024-11-27T15:22:51.990967+01:00] event.DEBUG: Notified event "kernel.terminate" to listener "Symfony\Component\HttpKernel\EventListener\ProfilerListener::onKernelTerminate". {"event":"kernel.terminate","listener":"Symfony\\Component\\HttpKernel\\EventListener\\ProfilerListener::onKernelTerminate"} []
[2024-11-27T15:22:51.991778+01:00] doctrine.INFO: Disconnecting [] []

Le log s’arrête là, pour ce dernier essai. Donc des déprécations pour lesquelles je ne suis pour rien, elles font partie des bundles. Je vais les corriger mais normalement, de ce que j’ai compris, les déprécations ne sont pas censées être des erreurs critiques.

Côté Local, j’obtiens par exemple :

[2024-11-27T14:38:13.608369+00:00] doctrine.DEBUG: Executing statement: SELECT t0.id AS id_1, t0.avatar_name AS avatar_name_2, t0.avatar_size AS avatar_size_3, t0.updated_at AS updated_at_4, t0.user_id AS user_id_5 FROM user_avatar t0 WHERE t0.user_id = ? (parameters: array{"1":9}, types: array{"1":1}) {"sql":"SELECT t0.id AS id_1, t0.avatar_name AS avatar_name_2, t0.avatar_size AS avatar_size_3, t0.updated_at AS updated_at_4, t0.user_id AS user_id_5 FROM user_avatar t0 WHERE t0.user_id = ?","params":{"1":9},"types":{"1":1}} []
[2024-11-27T14:38:16.541537+00:00] event.DEBUG: Notified event "kernel.response" to listener "Symfony\Component\Security\Http\Firewall\ContextListener::onKernelResponse". {"event":"kernel.response","listener":"Symfony\\Component\\Security\\Http\\Firewall\\ContextListener::onKernelResponse"} []
[2024-11-27T14:38:16.541697+00:00] event.DEBUG: Notified event "kernel.response" to listener "Nelmio\CorsBundle\EventListener\CorsListener::onKernelResponse". {"event":"kernel.response","listener":"Nelmio\\CorsBundle\\EventListener\\CorsListener::onKernelResponse"} []
[2024-11-27T14:38:16.541819+00:00] event.DEBUG: Notified event "kernel.response" to listener "Symfony\Component\HttpKernel\EventListener\ResponseListener::onKernelResponse". {"event":"kernel.response","listener":"Symfony\\Component\\HttpKernel\\EventListener\\ResponseListener::onKernelResponse"} []
[2024-11-27T14:38:16.541938+00:00] event.DEBUG: Notified event "kernel.response" to listener "Symfony\Component\WebLink\EventListener\AddLinkHeaderListener::onKernelResponse". {"event":"kernel.response","listener":"Symfony\\Component\\WebLink\\EventListener\\AddLinkHeaderListener::onKernelResponse"} []
[2024-11-27T14:38:16.542056+00:00] event.DEBUG: Notified event "kernel.response" to listener "Symfony\Component\HttpKernel\DataCollector\RequestDataCollector::onKernelResponse". {"event":"kernel.response","listener":"Symfony\\Component\\HttpKernel\\DataCollector\\RequestDataCollector::onKernelResponse"} []
[2024-11-27T14:38:16.542247+00:00] event.DEBUG: Notified event "kernel.response" to listener "Nelmio\CorsBundle\EventListener\CacheableResponseVaryListener::onResponse". {"event":"kernel.response","listener":"Nelmio\\CorsBundle\\EventListener\\CacheableResponseVaryListener::onResponse"} []
[2024-11-27T14:38:16.542370+00:00] event.DEBUG: Notified event "kernel.response" to listener "Symfony\Component\HttpKernel\EventListener\CacheAttributeListener::onKernelResponse". {"event":"kernel.response","listener":"Symfony\\Component\\HttpKernel\\EventListener\\CacheAttributeListener::onKernelResponse"} []
[2024-11-27T14:38:16.542489+00:00] event.DEBUG: Notified event "kernel.response" to listener "Symfony\Component\HttpKernel\EventListener\ProfilerListener::onKernelResponse". {"event":"kernel.response","listener":"Symfony\\Component\\HttpKernel\\EventListener\\ProfilerListener::onKernelResponse"} []
[2024-11-27T14:38:16.542607+00:00] event.DEBUG: Notified event "kernel.response" to listener "Symfony\Component\HttpKernel\EventListener\ErrorListener::removeCspHeader". {"event":"kernel.response","listener":"Symfony\\Component\\HttpKernel\\EventListener\\ErrorListener::removeCspHeader"} []
[2024-11-27T14:38:16.542724+00:00] event.DEBUG: Notified event "kernel.response" to listener "Symfony\Bundle\WebProfilerBundle\EventListener\WebDebugToolbarListener::onKernelResponse". {"event":"kernel.response","listener":"Symfony\\Bundle\\WebProfilerBundle\\EventListener\\WebDebugToolbarListener::onKernelResponse"} []
[2024-11-27T14:38:16.542842+00:00] event.DEBUG: Notified event "kernel.response" to listener "Symfony\Component\HttpKernel\EventListener\DisallowRobotsIndexingListener::onResponse". {"event":"kernel.response","listener":"Symfony\\Component\\HttpKernel\\EventListener\\DisallowRobotsIndexingListener::onResponse"} []
[2024-11-27T14:38:16.542961+00:00] event.DEBUG: Notified event "kernel.response" to listener "Symfony\Component\HttpKernel\EventListener\SessionListener::onKernelResponse". {"event":"kernel.response","listener":"Symfony\\Component\\HttpKernel\\EventListener\\SessionListener::onKernelResponse"} []
[2024-11-27T14:38:16.544084+00:00] event.DEBUG: Notified event "kernel.finish_request" to listener "Symfony\Component\HttpKernel\EventListener\LocaleListener::onKernelFinishRequest". {"event":"kernel.finish_request","listener":"Symfony\\Component\\HttpKernel\\EventListener\\LocaleListener::onKernelFinishRequest"} []
[2024-11-27T14:38:16.544210+00:00] event.DEBUG: Notified event "kernel.finish_request" to listener "Symfony\Component\HttpKernel\EventListener\RouterListener::onKernelFinishRequest". {"event":"kernel.finish_request","listener":"Symfony\\Component\\HttpKernel\\EventListener\\RouterListener::onKernelFinishRequest"} []
[2024-11-27T14:38:16.544327+00:00] event.DEBUG: Notified event "kernel.finish_request" to listener "Symfony\Bundle\SecurityBundle\Debug\TraceableFirewallListener::onKernelFinishRequest". {"event":"kernel.finish_request","listener":"Symfony\\Bundle\\SecurityBundle\\Debug\\TraceableFirewallListener::onKernelFinishRequest"} []
[2024-11-27T14:38:16.544443+00:00] event.DEBUG: Notified event "kernel.finish_request" to listener "Symfony\WebpackEncoreBundle\EventListener\ResetAssetsEventListener::resetAssets". {"event":"kernel.finish_request","listener":"Symfony\\WebpackEncoreBundle\\EventListener\\ResetAssetsEventListener::resetAssets"} []
[2024-11-27T14:38:16.544559+00:00] event.DEBUG: Notified event "kernel.finish_request" to listener "Symfony\Component\HttpKernel\EventListener\LocaleAwareListener::onKernelFinishRequest". {"event":"kernel.finish_request","listener":"Symfony\\Component\\HttpKernel\\EventListener\\LocaleAwareListener::onKernelFinishRequest"} []
[2024-11-27T14:38:16.740715+00:00] event.DEBUG: Notified event "kernel.terminate" to listener "Symfony\Component\HttpKernel\EventListener\ProfilerListener::onKernelTerminate". {"event":"kernel.terminate","listener":"Symfony\\Component\\HttpKernel\\EventListener\\ProfilerListener::onKernelTerminate"} []
[2024-11-27T14:38:16.741488+00:00] doctrine.INFO: Disconnecting [] []

Désolé pour le pavé que ça fait à parcourir, et merci - très sincèrement - à tous ceux qui prendront de leur temps pour me donner leur avis !

Edit : La seule référence à "196" que je trouve sur internet vient de Microsoft server SQL 2022, qui parle de 196 comme étant "SELECT INTO doit être la première requête dans une instruction contenant un opérateur UNION, INTERSECT ou EXCEPT." Je ne sais pas si ça s’applique à mon cas, d’une part, et d’autre part je ne vois pas trop ce que je pourrais y faire vu que les requêtes sont automatiquement faites par Doctrine ^^

+0 -0

Hmmm… Apache dit pas grand chose, mais si j’ai bien compris la requête arrive bien à Symfony donc c’est pas très grave.

Par contre la requête SQL que Symfony logue est pas la même, tu as bien testé la même page des deux côtés ?

Si tu exécutes la requête SQL de prod à la main sur le serveur SQL ça te donne le résultat voulu ? C’est peut-être tout simplement ça qui renvoie pas le bon résultat et que Symfony interprète comme une 404

Breaking News: Je m’installe à mon bureau ce matin et vois dans ma boite de réception un message du support technique de mon hébergeur :

J’ai ajouté un paramètre dans votre fichier .htaccess pour rediriger les requêtes vers index.php, qui gère le routage dans Symfony. Cette règle garantit que toutes les requêtes (comme /api/tags) sont envoyées à index.php, où Symfony peut traiter la demande. Pouvez-vous tester maintenant ? De mon côté, je constate que le site est désormais fonctionnel.

Et là, je vois qu’il est effectivement fonctionnel à 99%. Il se passe un truc bizarre au niveau de l’authentification (pas de nom ni d’avatar, et on perd l’identification quand on rafraichit la page), et il manque des images à droite à gauche mais la navigation sur le site a l’air à peu près normale à part ça.

Voilà le .htaccess modifié :

<IfModule mod_headers.c>
   SetEnvIf Origin "http(s)?://(www\.)?(domaine.fr)$" AccessControlAllowOrigin=$0$1
   Header add Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin
   Header set Access-Control-Allow-Credentials true
   Header set Access-Control-Allow-Methods "GET, POST, OPTIONS, PUT, PATCH, DELETE"
   Header set Access-Control-Allow-Headers "Content-Type, Authorization, X-Requested-With"
</IfModule>

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ /index.php [QSA,L]
</IfModule>

Je ne comprends même pas ce qu’il a fait. Qu’est-ce que c’était que le problème ? Est-ce un truc que j’ai fait de travers dans la configuration de Symfony ? Ce qu’il a fait là aurait-il dû et pu être fait sur Symfony ? Est-ce que ça interfère avec le processus d’identification de l’utilisateur ? Encore plein de mystères ^^

Edit : ah non tout fonctionne normalement si je suis bien sur WWW.mondomaine.fr. C’est quand il manque les 3w que l’identification foire (mais les api calls fonctionnent, eux). Je ne comprends vraiment pas bien cette histoire de www et de redirection. Il va falloir que je me renseigne, ça devient ridicule ^^

+0 -0

Il a effectivement corrigé le passage de paramètres entre Apache et Symfony (qui fait tout passer par un fichier central : index.php). En local ça fonctionne parce que je suppose que tu passes directement par le serveur PHP et non Apache.

Pour l’authentification tu as peut-être bloqué le header Cookies avec la ligne 6 de ta config, essaie de commenter temporairement la ligne pour voir si ça améliore les choses ?

En local j’utilise le serveur symfony fourni avec le squelette de base. Je n’avais jamais pris le temps de m’interroger là dessus…

A posteriori, maintenant le problème réglé, j’aimerais comprendre ce qui s’est passé, histoire de ne pas répéter la même erreur :

  • est-ce qu’il y avait quelque chose que j’aurais pu faire pour identifier le problème plus tôt ?
  • est-ce que j’ai foiré quelque part ma configuration de Symfony ?
  • est-ce que le souci se serait produit chez tous les hébergeurs ? Ou juste chez le mien pour une raison de configuration particulière qui m’échappe encore ?
  • est-ce que c’est quelque chose qui doit systématiquement être mis dans un fichier .htaccess ?

Une dernière question, pour finir la configuration une bonne fois pour toutes (enfin jusqu’à la prochaine mise à jour ^^). Pour rediriger définitivement toutes les urls en https://mondomaine.fr vers https://www.mondomaine.fr (qui fonctionne sans souci au niveau de l’identification et de tout le reste), je dois mettre à jour une dernière fois mon .htaccess et rajouter :

RewriteEngine on
RewriteCond %{HTTP_HOST} ^mondomaine.fr [NC]
RewriteRule ^(.*)$ https://www.mondomaine.fr/$1 [L,R=301]

C’est bien ça ? J’ai un doute sur le HTTP_HOST. Si oui à quel niveau du fichier je dois l’insérer sans casser ce que le technicien a mis ? Après la ligne 13 ?

Merci viki53 !

+0 -0

Tu peux mettre ce code dans un bloc <IfModule mod_rewrite.c></IfModule> où tu veux. Perso je le mettrais en haut pour l’appliquer en premier, mais c’est de la micro-optimisation.


Si tu avais voulu identifier le problème, il aurait fallu tester en local en passant par un serveur similaire (Apache, ici) et avec un nom de domaine. Tu peux utiliser localhost pour faire simple, ou ajouter un domaine de ton choix comme monsupersite.localhost au fichier hosts de ta machine pour pas trop t’embêter.

La configuration de Symfony est bonne je pense, puisque le problème est réglé, le problème venait de la configuration d’Apache qui doit gérer la réécriture d’URL pour envoyer toutes les requêtes vers index.php sinon Symfony les reçoit pas.

Tu aurais eu le même problème sur n’importe quel serveur, ce type de config est assez courant (j’ai la même chose sur Laravel par exemple). Normalement c’est indiqué dans la documentation des frameworks, tu as peut-être loupé cette partie.

Du coup oui, ça doit systématiquement être mis dans le .htaccess des sites Symfony. La syntaxe exacte pourrait varier d’une version à l’autre, ou d’un framework à un autre, mais globalement la logique est la même : il faut indiquer à Apache rediriger les requêtes pour tous les chemins qui ne correspondent pas à un fichier ou dossier local (les deux lignes finissants par !-f et !-d) vers index.php pour laisser le framework prendre la relève et gérer la réécriture d’URL à sa façon.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte