Partage
  • Partager sur Facebook
  • Partager sur Twitter

problème requete HTTP lors du passage en prod

    27 août 2023 à 0:52:48

    Bonsoir à tous,

    J'ai un controlleur symfony 

    #[Route('/ajax', name: 'ajax_')]
    class AjaxController extends AbstractController
    {
        #[Route('/{speciesId}/departure', name: 'get_departure', methods: ['POST'])]
        public function updateDeparture(
            Species $speciesId, 
            Request $request,
            SpeciesRepository $speciesRepo,
            EntityManagerInterface $entityManager): JsonResponse
        {
            $species = $speciesRepo->find($speciesId);
    
            if (!$species) {
                return new JsonResponse(['message' => 'Espèce non trouvée.'], 404);
            }
    
            $newDepartureDate = $request->request->get('date');
            $species->setDeparture($newDepartureDate);
            $species->setObservation('gone');
            $entityManager->persist($species);
            $entityManager->flush();
    
            return new JsonResponse(['message' => 'Mise à jour effectuée avec succès.']);
        }
    }

    puis un script JavaScript :

    validateBtn.addEventListener("click", async () => {
            const newDate = inputDate.value;
            const speciesId = validateBtn.getAttribute("data-species-id");
    
            if (newDate) {
                try {
                    const response = await fetch(`/ajax/${speciesId}/departure`, {
                        method: "POST",
                        headers: {
                            "Content-Type": "application/json"
                        },
                        body: JSON.stringify({ date: newDate })
                    });
    
                    if (!response.ok) {
                        throw new Error('Network response was not ok');
                    }
    
                    const responseData = await response.json();
    
                    contentContainer.innerHTML = `
                        <span class="underline underline-offset-2">Départ à Beauval :</span> <strong>${newDate}</strong>
                    `;
                    modal.classList.add("hidden");
                    inputDate.value = "";
                } catch (error) {
                    console.error("Erreur lors de la mise à jour de la base de données", error);
                }
            }
        });

    lorsque je joue le code j'ai une différance entre l'url de la requete entre l'environnement DEV et l'environnement PROD.

    en dev j'ai bien : http://mon-nom-de-domaine/monProjet/public/ajax/92/departure qui me donne bien une 200 et me modifie bien ma base de donnée

    en prod j'ai http://mon-nom-de-domaine/ajax/92/departure du coup j'obtiens une 404. 

    Pourquoi une partie de l'url disparait lorsque je passe en prod ? en sachant que je n'ai aucun soucis avec mes routes php

    ps : je suis avec Symfony 5.4, php8-2 et sur Apache2 

    Si quelqu'un peu m'aiguiller, je ne sais plus ou chercher.... 

    merci à tous

    • Partager sur Facebook
    • Partager sur Twitter
      27 août 2023 à 10:53:51

      Salut

      Normalement, pour éviter ce genre de souci, tu ne devrais pas avoir /monProjet/public dans l'URL en développement non plus, parce qu'à mon sens, c'est l'URL de production qui me paraît la plus correcte (elle n'expose ni le nom du projet, ni le dossier public).

      Quel outil serveur utilisais-tu en développement ? Avais-tu un fichier .heaccess que tu aurais envoyé en production ?

      • Partager sur Facebook
      • Partager sur Twitter
        28 août 2023 à 14:08:34

        Bonjour, 

        Pour le développement j'utilise WAMP. 

        Le fichier .htaccess a été créé au moment du passage sur le server de production. Il a été créé dans le dossier public. 

        Il a été créé lorsque j'ai exécuté la commande 

        composer require symfony/apache-pack

        et il est composé comme ça : 

        # Use the front controller as index file. It serves as a fallback solution when
        # every other rewrite/redirect fails (e.g. in an aliased environment without
        # mod_rewrite). Additionally, this reduces the matching process for the
        # start page (path "/") because otherwise Apache will apply the rewriting rules
        # to each configured DirectoryIndex file (e.g. index.php, index.html, index.pl).
        DirectoryIndex index.php
        
        # By default, Apache does not evaluate symbolic links if you did not enable this
        # feature in your server configuration. Uncomment the following line if you
        # install assets as symlinks or if you experience problems related to symlinks
        # when compiling LESS/Sass/CoffeScript assets.
        # Options +FollowSymlinks
        
        # Disabling MultiViews prevents unwanted negotiation, e.g. "/index" should not resolve
        # to the front controller "/index.php" but be rewritten to "/index.php/index".
        <IfModule mod_negotiation.c>
            Options -MultiViews
        </IfModule>
        
        <IfModule mod_rewrite.c>
            # This Option needs to be enabled for RewriteRule, otherwise it will show an error like
            # 'Options FollowSymLinks or SymLinksIfOwnerMatch is off which implies that RewriteRule directive is forbidden'
            Options +FollowSymlinks
        
            RewriteEngine On
        
            # Determine the RewriteBase automatically and set it as environment variable.
            # If you are using Apache aliases to do mass virtual hosting or installed the
            # project in a subdirectory, the base path will be prepended to allow proper
            # resolution of the index.php file and to redirect to the correct URI. It will
            # work in environments without path prefix as well, providing a safe, one-size
            # fits all solution. But as you do not need it in this case, you can comment
            # the following 2 lines to eliminate the overhead.
            RewriteCond %{REQUEST_URI}::$0 ^(/.+)/(.*)::\2$
            RewriteRule .* - [E=BASE:%1]
        
            # Sets the HTTP_AUTHORIZATION header removed by Apache
            RewriteCond %{HTTP:Authorization} .+
            RewriteRule ^ - [E=HTTP_AUTHORIZATION:%0]
        
            # Redirect to URI without front controller to prevent duplicate content
            # (with and without `/index.php`). Only do this redirect on the initial
            # rewrite by Apache and not on subsequent cycles. Otherwise we would get an
            # endless redirect loop (request -> rewrite to front controller ->
            # redirect -> request -> ...).
            # So in case you get a "too many redirects" error or you always get redirected
            # to the start page because your Apache does not expose the REDIRECT_STATUS
            # environment variable, you have 2 choices:
            # - disable this feature by commenting the following 2 lines or
            # - use Apache >= 2.3.9 and replace all L flags by END flags and remove the
            #   following RewriteCond (best solution)
            RewriteCond %{ENV:REDIRECT_STATUS} =""
            RewriteRule ^index\.php(?:/(.*)|$) %{ENV:BASE}/$1 [R=301,L]
        
            # If the requested filename exists, simply serve it.
            # We only want to let Apache serve files and not directories.
            # Rewrite all other queries to the front controller.
            RewriteCond %{REQUEST_FILENAME} !-f
            RewriteRule ^ %{ENV:BASE}/index.php [L]
        </IfModule>
        
        
        <IfModule mod_headers.c>
            Header set Access-Control-Allow-Origin "*"
            Header set Access-Control-Allow-Methods "GET, POST, OPTIONS"
            Header set Access-Control-Allow-Headers "Content-Type, Authorization"
        </IfModule>
        
        <IfModule !mod_rewrite.c>
            <IfModule mod_alias.c>
                # When mod_rewrite is not available, we instruct a temporary redirect of
                # the start page to the front controller explicitly so that the website
                # and the generated links can still be used.
                RedirectMatch 307 ^/$ /index.php/
                # RedirectTemp cannot be used instead
            </IfModule>
        </IfModule>
        




        -
        Edité par Jordan Olanier 28 août 2023 à 14:09:13

        • Partager sur Facebook
        • Partager sur Twitter
          28 août 2023 à 15:06:41

          Jordan Olanier a écrit:

          Pour le développement j'utilise WAMP.

          Et excuse-moi de demander, mais tu l'utilises vraiment, ou tu suis la documentation de Symfony et tu lances une commande pour le serveur ?

          Et pour ce qui est de lier ton JavaScript au site, comment t'y prends-tu dans les templates ?

          Reste que je ne comprends pas comment, sans .htaccess, tu pouvais utiliser sans souci une adresse style http://domaine/projet/public et que ça pose problème maintenant. A moins que tu aies envoyé le cache sur le serveur ?
          Qui plus est, le domaine que tu ne renseignes pas, c'est localhost pour tes développements, ou tu as créé un hôte virtuel ? Dans ce dernier cas, pourquoi ne pas avoir spécifié la racine dans le dossier public pour avoir la même chose qu'en production ?

          -
          Edité par Ymox 28 août 2023 à 15:08:30

          • Partager sur Facebook
          • Partager sur Twitter
            28 août 2023 à 15:37:13

            pour développer mon site, je l'ai "hébergé" sur WAMP et afin de pouvoir visualiser mon site je lançais la commande sur mon projet 

            php -S 0.0.0.0:8000 -t public

            qui me permettait d'avoir accès au site via l'url localhost:8000, ce qui me donnait l'url `http://localhost:8000/` pour atteindre ma page d'accueil.

            Pour la prod j'ai décidé d'héberger mon site sur mon raspberry pi4, j'ai installé tous les éléments nécessaire pour la production apache2, php8.2, mysql, ... 

            pour que ça fonctionne j'ai lancé la commande pour le apache-pack qui m'a créé le fameux `.htaccess` dans le dossier public du projet, ainsi que tout son contenu. 

            J'ai modifié la config dans le fichier `apache2.conf` afin de pouvoir avoir accès à toutes les routes de mon site et ne plus avoir de 404 sur les autres pages de mon site `AllowOverride All` au lieu de `AllowOverride None` 

            <Directory /var/www/>
                    Options Indexes FollowSymLinks
                    AllowOverride All
                    Require all granted
            </Directory>

            du coup afin d'accéder à mon site via l'extérieur j'ai créé un nom de domaine qui pointe vers mon raspberry mais ensuite pour atteindre le site je suis obligé de me rendre sur le dossier mon-projet puis public ce qui me donne l'url `http://domaine/mon-projet/public/` lorsque je veux être sur ma page d'accueil. 

            je n'ai donc pas choisi de faire apparaitre `/mon-projet/public` dans l'url, il vient tout seul lorsque je vais sur mon site (sauf si j'ai fais une mauvaise manip' quelque part). 

            Pour ce qui est des scripts Javascript ils sont directement écrit dans les templates avec les balises <script> qui vont bien (j'ai essayé de les mettre dans un fichier js dans public mais ça ne change rien au problème) tous mes scripts fonctionnent bien sauf ceux utilisant ajax qui ont donc une erreur 404 avec le problème que j'ai expliqué au début. 

            Mais lorsque je passe mon site en dev sur le raspberry (donc celui qui possède le `.htaccess`) je n'ai pas de 404, elles viennent uniquement si je repasse en prod. 

            J'espère être assez clair dans mes explications... :euh:

            • Partager sur Facebook
            • Partager sur Twitter
              28 août 2023 à 15:55:08

              Bon, en gros, tu as installé une centrale nucléaire (WampServer), prépares la dynamo de ton vélo (php -S), et finis par te rendre à pieds à destination (…/projet/public/…) …

              Si tu as installé WampServer, oublie la ligne de commandes que tu mentionnes, et aide-toi avec un hôte virtuel correct – tu peux oublier les lignes 10 à 17 qui y sont mentionnées pour Apache du fait que tu utilises WampServer. Note que, aux chemins près, tu peux tout à fait utiliser la même chose sur ton Raspberry Pi, vu que c'est aussi Apache que tu y as installé.

              Si j'en crois ce que tu as mis ci-avant, tu avais inversé les deux URLs dans ton premier message (repris juste après), non ?

              Jordan Olanier a écrit:

              en dev j'ai bien : http://mon-nom-de-domaine/monProjet/public/ajax/92/departure qui me donne bien une 200 et me modifie bien ma base de donnée

              en prod j'ai http://mon-nom-de-domaine/ajax/92/departure du coup j'obtiens une 404.

              Edit 2

              Pour le mode de développement sur ton Raspberry Pi, tu n'aurais pas envoyé ton cache aussi ?


              Si tu mets tes scripts directement dans les templates, il faudrait traiter les routes qui s'y trouvent comme s'il s'agissait d'assets, donc soit les encadrer avec la fonction Twig asset() (attention, il me semble qu'il faut enlever le / initial que tu as mis, il sera ajouté par la fonction), soit générer les routes avec path() là aussi plutôt que de les mettre à la main. Le problème serait probablement le même si tu avais des scripts liés avec asset('mon/scripts.js') dans le template plutôt qu'en dur dedans, à ceci que la solution aurait été d'externaliser les routes des scripts pour pouvoir les récupérer plutôt que les générer directement dans le script (attributs data-* et DOMElement.dataset.*).

              Edit 1

              Ce n'est aucunement un souci de JavaScript (ni de Symfony), mais j'avoue que je ne vois pas vraiment dans quel forum ce sujet serait le mieux.

              -
              Edité par Ymox 28 août 2023 à 16:49:52

              • Partager sur Facebook
              • Partager sur Twitter
                28 août 2023 à 16:56:00

                Pour le coup je peux même oublier WampServer et la façon de lancer mon projet vu que si je suis passé sur mon Raspberry Pi c'est pour ne plus l'utiliser (vu que ça restait en local et que je veux pouvoir utiliser mon site de n'importe où)

                Pour les deux routes non c'est bien ça (sur mon Raspberry toujours, vu que le nom de domaine point vers ce dernier) : en dev j'ai : http://mon-nom-de-domaine/monProjet/public/ajax/92/departure qui me donne bien une 200 et me modifie bien ma base de donnée mais en prod j'ai : http://mon-nom-de-domaine/ajax/92/departure du coup j'obtiens une 404

                Pour ce qui est des routes dans le script lui même j'ai également tout essayé, en dur, avec path(), avec asset(), peut importe la façon de faire, dès que je passe en prod il me supprime toujours la partie monProjet/public et me donne une 404.

                J'ai déjà cherché sur plusieurs forums, sur la doc symfony, du coté d'apache aussi, mais vu que je ne sais pas d'où vient réellement le soucis c'est compliqué d'avoir une bonne recherche..

                Edit
                en effet dans le dossier var/cache j'ai bien un dev remplit de fichiers sur mon raspberry, il faudrait donc que je le supprime ?

                Je vais regarder de plus près la doc que tu m'as donné en espérant trouver un point d'ancrage pour résoudre mon soucis, merci pour ton temps :)

                -
                Edité par Jordan Olanier 28 août 2023 à 16:59:00

                • Partager sur Facebook
                • Partager sur Twitter
                  28 août 2023 à 17:17:17

                  Normalement, sauf cache, il ne doit pas y avoir de différence de comportement entre les environnements programme dev et prod, vu qu'ils sont sur la même machine. Le code, quand il est envoyé sur une nouvelle machine, ne doit pas être accompagné des caches, juste éventuellement les dossiers mais pas leurs contenus.

                  Et si tu utilises un hôte virtuel correctement configuré, tu peux oublier symfony/apache-pack, ce qui ferait qu'en accédant au nom de domaine plutôt qu'avec l'adresse IP ou le nom de machine, tu aurais le même comportement d'URLs entre dev et prod — pense effectivement à en vider les caches.

                  Edit

                  Etrange, voilà trois fois que je ne reçois pas de notification pour tes réponses…

                  -
                  Edité par Ymox 28 août 2023 à 17:20:10

                  • Partager sur Facebook
                  • Partager sur Twitter
                    28 août 2023 à 18:01:27

                    Je n'ai reçu aucune notification de mon coté non plus, je pensais que c'était normal :)

                    Je vais étudier tout ça, c'est mon premier server perso alors je ne connais pas encore tout les rouages :)

                    Merci beaucoup pour le coup de main, je reviens dire si je réussi à régler le soucis ou pas

                    Edit
                    Bon une bonne chose de faite, en vidant les caches (j'ai vidé les deux pour le coup ! ) je n'ai plus d'erreur 404 mais j'ai bien une réponse 200 (bon du coup il ne met pas à jour ma base de données mais j'ai peut être une coquille qui s'est glissée dans mon script, à force de changer les choses ^^').

                    Edit 2
                    problème complètement résolu :D

                    Encore merci Ymox pour ton aide, j'aurais du penser à vérifier que le cache se vidait bien et surtout maintenant je sais qu'il ne doit pas suivre le mouv.

                    -
                    Edité par Jordan Olanier 28 août 2023 à 21:22:19

                    • Partager sur Facebook
                    • Partager sur Twitter

                    problème requete HTTP lors du passage en prod

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown