[Symfony 7] Déploicement d'une application symfony sur apache

Erreur 404 ou 500

a marqué ce sujet comme résolu.

Bonjour à tous, J’ai un problème lors du déploiment d’une nouvelle application Symfony. J’ai utilisé les anciens htaccess d’un symfony 5, mais ca ne marché pas. (erreur 404 impossible à résoudre) Mon application est actuellement en Symfony 7, j’ai donc chercher sur Google, suivi le tuto officiel symfony, puis trouver un htaccess qui est semble le même que généré par symfony/apache-pack c’est celui-ci: https://gist.github.com/alch/7766993 que j’ai testé.

A l’heure actuelle, mon .htaccess dans public/ ressemble à ç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 +SymLinksIfOwnerMatch

# 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 +SymLinksIfOwnerMatch

    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_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>

Mon problème est que je suis obligé de me rendre sur domain.fr/subdir/public pour que le site s’affiche, et même pas totalement, il n’affiche pas les assets. Quand je vais juste sur domain.fr/subdir il m’affiche une erreur généré par symfony.

J’ai vu ce poste: https://zestedesavoir.com/forums/sujet/14448/symfony-sans-hote-virtuel-reecrire-pour-masquer-public-et-si-besoin-indexphp/ j’ai donc tenté ce qui était dit dedans, rien à faire, soit je me prend 404 de la part de symfony, soit de la part d’apache. J’ai aussi testé ce site: https://htaccess.madewithlove.com/ pour essaye de bidouiller mon htaccess, mais rien à faire.

Voici le htaccess dans la "racine" de mon sous-dosser:

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

Pour le problème d’asset, d’après ce que je vois dans la console de debug il tente de les trouvaos sur domain.fr/assets au lieu de domain.fr/subdir/assets or je pensais que le apache-pack permettais justement de géré les applications dans des sous-dossiers ?

Je me prend la tête sur ces deux problème depuis une petite semaine et vu que le htaccess ce n’est pas ma tasse de thé, je vous demande donc de l’aide ! Merci à vous de vos futur réponse.

+0 -0

Salut

Permets-moi de m’en assurer : tu as accès à "un niveau au-dessus de la racine web", ou non ?

Je croyais avoir vu au départ que tu parlais d’un conteneur (Docker), est-ce que c’est bien le cas, c’était ou ça ne l’a jamais été ?

Edit

A l’occasion, il faudra qu’on m’explique la tendance à vouloir copier-coller le .htaccess depuis on-ne-sait-où plutôt que d’installer syfmony/apache-pack, qui est à mon sens un tant soit peu plus sûr, et qui à une époque ajoutait d’autres .htaccess dans le projet, pas juste dans le dossier /public.

Et au temps pour moi, cette histoire de conteneur, c’est parce que tu sembles avoir testé sur une machine virtuelle.

Mais j’insiste : si tu veux mettre ton site en ligne chez OVH et en tant que site principal, à moins que tu n’aies une offre que je ne connais pas, tu peux mettre le code "hors dossier /public à la racine du FTP, et le contenu du dossier /public de ton projet dans le dossier /www.

Si tu veux mettre en tant que sous-domaine, tu as normalement le même procédé qui peut être suivi, soit que tu mets le code du site "autour" du dossier racine pour l’hôte virtuel du sous-domaine, et ensuite le contenu du dossier /public de ton projet dans ce qui a été désigné comme racine lors de la création du sous-domaine (parfois un dossier du nom dudit sous-domaine).

Dans les deux cas, il te faudra symfony/apache-pack, à moins que tu ne puisses effectuer des modifications pour les hôtes virtuels.

Voir ce sujet sur OpenClassrooms, et plus précisément le message spécifiquement lié.

Pour ce qui est de la machine virtuelle, là tu devrais pouvoir définir un hôte virtuel avec tout ce qu’il faut, si c’est fait correctement, il ne devrait pas y avoir de problème. Si c’était un Docker ou assimilé, il devrait y avoir moyen de configurer le conteneur pour que la racine pointe au bon endroit.

+1 -0

Merci pour cette réponse détaillé ! Je ne suis pas sous docker non effectivement, j’ai bien accès à la racine du fichier web.

J’ai installer symfony/apache-pack, et justement il n’arrive pas à charger les assets quand on est sur /subdir/public car il est cherche sur /

En ce qui concerne de déplacement le contenu do dossier public/ je ne suis pas très fan, comme dit avant, j’ai une application sous symfony 6, sur le même hébergeur, sans configuration du DocumentRoot mais juste avec du .htaccess, de plus il est dans un sous dossier de mon site principal

Je ne peux pas touché au virtualhost, comme dit dans mon poste initial, c’est un sous dossier, donc modifier le virtual host ne me semble pas utile, et je n’y ai pas accès chez mon hébergeur il me semble.

Est-ce que tu peux expliciter un peu plus l’organisation de tes dossiers, s’il te plaît ? Parce que pour le moment, je ne comprends pas vraiment celle que tu as, et c’est important pour qu’on puisse t’aider correctement.

Qui plus est, tu parles d’une application Symfony 6 : c’est ton site principal, ou c’est encore un autre site ? Elle se situe où dans l’arborescence ?

Est-ce que tu utilises des sous-domaines, ou tu ne souhaites justement pas ?

Concrètement, est-ce qu’une de ces possibilités correspond à ce que tu cherches à faire, ou est-ce une autre ?

(racine FTP d'OVH)
├───…
⋮
└───www (racine de ton site principal)
    ├───(site Symfony 6)
    │   ├───bin, config, migrations, src, templates, tests, translations, var, vendor
    │   ├───public
    │   ⋮   └───site Symfony 7 : possibilité 1
    ⋮   site Symfony 7 : possibilité 2
    site Symfony 7 : possibilité 3

Si ton application Symfony 6 n’est pas ton site principal, quel est le moteur de ce site ?

+0 -0

Mon application n’est pas le site principal, c’est un autre site, de test, je souhaite éviter les sous-domaine si possible, mais si il faut passer par là pour le bon fonctionne du site je le ferais. Je parle de Symfony 7 et non du 6 (même si ca ne doit pas avoir énormément d’importance). Voici l’arborescence du site:

(racine FTP)
├── index.html (mon site, racine du site)
└─── vikingrp (site symfony 7)
     │   ├─── bin, config, migrations, src, templates, tests, translations, var, vendor
     │   ├─── public

Il n’y a pas vraiment de moteur pour le premier site, c’est un site avec ma page perso et les projets que j’ai réaliser, juste du HTML de base, avec un formulaire qui pointe vers script PHP.

J’espère avoir était clair cette fois.

Je crois bien qu’il manque un niveau dans ce que tu montres. Quand tu te connectes, tu es bien dans le dossier où se trouve ton index.html, mais tu ne peux vraiment pas remonter d’un niveau ? Ce serait pratique, parce que tu pourrais y mettre tous les dossiers listés ligne 4, effectuer quelques configurations (c’est le dernier lien du sujet que tu as lié), et mettre le contenu de ton dossier public/ directement dans vikingrp/.

+0 -0

Non je ne peux vraiment pas remon,ter d’un niveau, le dossier racine "/" contient mon index.html puis mon dossier vikingrp. Ce que je comprend pas, c’est qu’avec un autre site sous symfony 6 (de base 5 mais upgrade en 6), sur le même hébergeur, ca marche. Après ce dernier est à la racine du serveur. Il faut absolument que Symfony soit à la racine du serveur ? Ce n’est pas possible de le mettre dans un sous dossier ? (c’est pour faire une démonstration & des tests en prod avant de le mettre sur le site "officiel")

Non, il ne faut pas absolument que ce soit à la racine, mais c’est une des solutions simples, bien que je ne comprenne pas comment cela peut fonctionner sur un autre hébergement du même fournisseur. Est-ce que ce sont les mêmes formules dans les deux cas ?
Tu confirmes aussi que c’est bien le contenu de index.html à la racine FTP (donc là où tu ne peux plus remonter bien que tu aies essayé) que tu vois, et pas un autre qui serait ailleurs ?

Quels sont les autres dossiers au niveau où tu as ton index.html ?
Est-ce que tu as un fichier .ovhconfig, et où se trouve-t’il ?
Qu’as-tu comme options dans la console d’hébergement ?

+0 -0

Non justement le site qui marche est héberger à la racine du domaine, d’où le fait qu’il marche.

Je confirme que c’est bien le contenu du index.html à la racine que je vois, pour ne être sur je l’ai modifié, et ca l’a bien modifié sur mon domaine.

Je ne suis pas chez OVH, mais chez Ionos, sauf pour ma VM qui est en local, donc pas de .ovhconfig J’ai pas l’impression d’avoir grand choses, je peux configuré des sous-domaines, changer la version PHP, voir les performances, scan le site pour voir ce qui va pas niveau SEO ou faille de séucrité, créer des bases de données, créer des utilisateur sftp/ssh et commander un CDN. Donc rien pour modifier le virtualhost j’ai l’impression :/ Mais je vais prendre l’option sous-domaine je pense, comme ça on se compliquera pas la vie, même si j’avoue que j’aimerais bien comprendre pourquoi sur un sous dossier ca ne marche pas

Ouhlà, au temps pour moi et toutes mes excuses, je ne sais pas pourquoi je suis resté bloqué sur le mauvais hébergeur (en même temps, celui que tu utilises n’apparaît ici que dans le message ci-dessus…).

Avec un sous-domaine, j’espère que tu peux spécifier la racine de celui-ci et non qu’elle est immuable.

+0 -0

Tout marche bien avec le sous domaine qui pointe sur le dossier public/ de mon application, vraiment dommage que je ne sois pas arrivé à modifier je htaccess pour le mettre en sous dossier, mais c’est mieux que rien et peut être plus jolie de l’avoir en sous domaine !

Juste une dernière question, pourquoi sur mon ancienne APP je ne pointe pas sur public/ mais sur / avec un .htaccess qui redirige sur public/ et la je dois directement pointé sur public/ le comportement de symfony à changer ? Ou alors c’était aussi du au fais que j’étais dans un sous dossier ?

Comme je l’ai demandé, est-ce que c’est la même formule d’hébergement (même tarif, même plan, même "modèle", etc.) ? Et qu’y avait-il dans ce .htaccess ?

J’ai aussi cru comprendre qu’au moins à un moment, Ionos proposait l’installation de sites Symfony, est-ce que cela aurait été fait avec leur solution ?

+0 -0
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