Bonjour à tous,
J'ai développé une application Symfony en suivant plusieurs tutoriels et formations.

Mon entreprise posséde un serveur Web sous Windows serveur 2013 qui utilise apache, php 7.4 et mysql et déconnecté d'internet. Il s'y trouve d'autres projets et des sites Intranet.

Mon projet a été développé en utilisant le serveur symfony et accessible sous https://localhost:8000
Mais en production, il doit être joignable sous https://<adresse_ip_du_serveur/ulule/

J'ai ce .htaccess à la racine de mon projet dans le dossier .../www/html/ulule/
"<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /ulule/

RewriteCond %{THE_REQUEST} /public/([^\s?]*) [NC]
RewriteRule ^ %1 [L,NE,R=302]

RewriteRule ^((?!public/).*)$ public/$1 [L,NC]
</IfModule>"

Et, celui-ci, généré par symfony/apache-pack dans le dossier .../www/html/ulule/public/
"DirectoryIndex index.php
<IfModule mod_negotiation.c>
Options -MultiViews
</IfModule>
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_URI}::$0 ^(/.+)/(.)::\2$
RewriteRule .
- [E=BASE:%1]
RewriteCond %{HTTP:Authorization} .+
RewriteRule ^ - [E=HTTP_AUTHORIZATION:%0]
RewriteCond %{ENV:REDIRECT_STATUS} =""
RewriteRule ^index.php(?:/(.*)|$) %{ENV:BASE}/$1 [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ %{ENV:BASE}/index.php [L]
</IfModule>
<IfModule !mod_rewrite.c>
<IfModule mod_alias.c>
RedirectMatch 307 ^/$ /index.php/
</IfModule>
</IfModule>

Quand j'essai d'accéder à mon application j'ai le message d'erreur :
No route found for "GET http://<ip_du_serveur>/ulule/"

Je retourne Google dans tous les sens depuis 3 jours et je ne comprends pas mon erreur.
Personne n'a-t-il installé un appli développée en symfony sur un serveur pro, coupé d'Internet ?

Pour déployer mon application, je fais simplement un copier/coller de mon dossier de développement sur le serveur de prod.
Est-ce ma méthode de déploiement qui est faussée ?

A savoir également, que si j'accède à http://<ip_du_serveur>/ulule/public
Mon application fonctionne mais j'ai uniquement le html qui s'affiche, sans css, ni javascript, ni les assets...

6 réponses


popotte
Réponse acceptée

Okay alors l'env de synfo est plus compliqué que celui de Laravel :X

Bon tu as 3 liens pour la DB:

DATABASE_URL="sqlite:///%kernel.project_dir%/var/data.db"

DATABASE_URL="mysql://mysql_user:mysql_password@127.0.0.1:3306/ulule?serverVersion=5.7"
DATABASE_URL="postgresql://symfony:ChangeMe@127.0.0.1:5432/app?serverVersion=13&charset=utf8" 

Au niveau du comportement ça va se passer en cascade synfo va recupérer la dernière DB url, donc postgresql, ensuite ton host est sur 127.0.0.1 (localhost) faut créer une db sur le serveur de prod et remplacer 127.0.0.1 par le host de la db de prod

Ensuite pour le css js, alors lances un npm run prod, ensuite faut régler les assets:

https://symfony.com/doc/current/components/asset.html

Et en principe ça devrait etre bon :p

popotte
Réponse acceptée

Ah okay, alors si tu veux éviter ce genre de problème à l'avenir, je te conseilles de passer par Docker pour ton projet ;)

ou alors prendre en compte l'env de prod ou local:

https://webpack.js.org/guides/environment-variables/

Hello, tu peux envoyer le contenu de .env.production ou .env si tu utilises le .env en prod? (oublies pas de retirer tout ce qui est user et password :p)

Aklain52
Auteur

"

In all environments, the following files are loaded if they exist, the latter taking precedence over the former:

#

* .env contains default values for the environment variables needed by the app * .env.local uncommitted file with local overrides * .env.$APP_ENV committed environment-specific defaults * .env.$APP_ENV.local uncommitted environment-specific overrides

#

Real environment variables win over .env files.

#

DO NOT DEFINE PRODUCTION SECRETS IN THIS FILE NOR IN ANY OTHER COMMITTED FILES.

#

Run "composer dump-env prod" to compile .env files for production use (requires symfony/flex >=1.2). https://symfony.com/doc/current/best_practices.html#use-environment-variables-for-infrastructure-configuration

> symfony/framework-bundle

APP_ENV=dev
APP_SECRET=3245120621161d94e3f30ee053faf884

< symfony/framework-bundle

> symfony/mailer

MAILER_DSN=smtp://localhost

< symfony/mailer

> doctrine/doctrine-bundle

Format described at https://www.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/configuration.html#connecting-using-a-url IMPORTANT: You MUST configure your server version, either here or in config/packages/doctrine.yaml

#

DATABASE_URL="sqlite:///%kernel.project_dir%/var/data.db"

DATABASE_URL="mysql://mysql_user:mysql_password@127.0.0.1:3306/ulule?serverVersion=5.7"

DATABASE_URL="postgresql://symfony:ChangeMe@127.0.0.1:5432/app?serverVersion=13&charset=utf8"

< doctrine/doctrine-bundle

"

Aklain52
Auteur

A force d'acharnement et de discussions, j'ai réussi à faire fonctionner mon installation.
Tout fonctionne désormais.

Donc en résumé :

Il m'a fallu installer webpack-encore-bundle et apache-pack

Code : Sélectionner tout - Visualiser dans une fenêtre à part

composer require symfony/webpack-encore-bundle
composer require symfony/apache-pack
npm install
symfony console cache:clear

Indiquer la racine du projet dans webpack.config.js
Code : Sélectionner tout - Visualiser dans une fenêtre à part

.setPublicPath('/ulule/public/build')

Modifier mes raccourcis et liens vers les images en passant en lien relatif
Code : Sélectionner tout - Visualiser dans une fenêtre à part

<a class="nav-link" href="/garage">Garage</a>

devient :
Code : Sélectionner tout - Visualiser dans une fenêtre à part

<a class="nav-link" href="garage">Garage</a>

Il ne me reste plus qu'à faire un petit htaccess à la racine pour renvoyer vers public.

Par contre, ce qui est désagréable, c'est que désormais si j'utilise le serveur de développement de symfony avec un
Code : Sélectionner tout - Visualiser dans une fenêtre à part

symfony server:start

mon application se lance mais sans les css et js de bootstrap...

Merci pour votre aide.

Aklain52
Auteur

Merci @popotte,

En fait mon problème de css était situé dans webpack.config.js
En dev je dois mettre : .setPublicPath('/build')
Mais en prod : .setPublicPath('/ulule/public/build')

Avant de faire un npm run:build
Et là, tout fonctionne nickel.