Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour,
Je dois migrer mon projet dans le sous dossier d'un serveur (/www/monProjet) et pas à la racine, mais j'ai du mal à configurer le htaccess. J'ai réussi à pointer vers la page index avec ces règles :
RewriteEngine On RewriteRule ^\.htaccess$ - [F] RewriteCond %{REQUEST_URI} ="" RewriteRule ^.*$ public/index.php [NC,L] RewriteCond %{REQUEST_URI} !^/public/.*$ RewriteRule ^(.*)$ public/$1 RewriteCond %{REQUEST_FILENAME} -f RewriteRule ^.*$ - [NC,L] RewriteRule ^public/.*$ public/index.php [NC,L]
mises dans le dossier monProjet, mais l'application ne trouve aucune route, les images, css, javascripts ne sont pas chargés non plus (il va les chercher dans un dossier à la racine du serveur, plutôt que dans le sous dossier "monProjet").
Pourriez-vous m'aider ?
PS : Je n'ai pas accès aux vhosts sur le serveur.
Hors ligne
Bonjour,
Comme c'est une application Zend Framework 2 le Vhost doit surement etre de ce type :
<VirtualHost *:80> ServerName www.tonProjet.com DocumentRoot "blabla/unfichier/www/tonProjet/public" SetEnv APPLICATION_ENV "development" <Directory blabla/unfichier/www/tonProjet/public> DirectoryIndex index.php AllowOverride All Order allow,deny Allow from all </Directory> </VirtualHost>
Ton soucis je pense c'est que tu redirige que le fichier index et que du coup il te trouve l'index, mais le document root n'a pas changé (de même que ton public directory) et ton dossier public pour l'application doit surement se baser sur le vhost donc pour ton appli les css etc... sont toujours a la racine donc il ne les trouve plus.
Je ne sais pas puisque tu ne peux pas modifier le vhost ce que tu peux faire, peut être rediriger aussi dossier css, js et img a son nouvel emplacement...
C'est là qu'on remarque que cette déclaration du vhost est crucial pour une appli zf2.
Orkin ou d'autre auront peut être plus d'indication a te donner que moi.
Hors ligne
Salut,
tu peux essayer avec un lien symbolique dans le dossier racine du serveur vers ton fichier index.php dans le dossier public. Et du coup tu gardes le fichier .htaccess de base.
Hors ligne
Le problème c'est que je ne dois pas mettre de fichier en dehors du dossier de mon projet (pour ne pas polluer le serveur). Le serveur contient plusieurs projets et chaque projet doit être accessible par "http://ipServeur/nomProjet".
Je ne pense pas que mon problème soit si compliqué que ça à résoudre, pour moi il faudrait juste dire via le htaccess que le répertoire root pour mon application soit le répertoire "monProjet" plutôt que le répertoire "www" du serveur.
Hors ligne
EN fait je me pose la question de savoir comment le vhost à été déclaré pour ton appli zf2 en premier lieu ?A moins que en le mettant à la racine du serveur la question ne se pose peut être pas (et encore je doute).
Je n'ai pas d'idée. Désolé
Hors ligne
Hello,
Tu arrive à avoir ta page d'accueil c'est ça?
Si oui, tu peu définir (en théorie je ne l'ai jamais utilisé encore =x) l'environnement de ton application sur ton serveur avec le "ZF2_PATH" dans ton public/index.php:
[lang=php] //index.php putenv('ZF2_PATH=/path_to_your_framework_folder');
sinon tu peu le faire dans ton htaccess (toujours en théorie ^^) au début de ton fichier :
SetEnv ZF2_PATH /myfolder/anotherfolder/zendpath
Dernière modification par flobrflo (14-05-2014 10:48:16)
Hors ligne
JGreco a écrit:
EN fait je me pose la question de savoir comment le vhost à été déclaré pour ton appli zf2 en premier lieu ?
Je passe d'une application en local (sous Wamp) vers un serveur où je n'ai pas les droits pour accéder à la config. Sous Wamp je peux très bien modifier mon fichier httpd-vhosts.conf, mais pas là.
Habituellement, quand je mettais mes sites sur un serveur, je n'avais accès qu'au répertoire où je met mon projet et il est défini comme étant la racine du serveur (et je ne peux pas aller voir ce que les autres ont mis), mais ce n'est pas le cas là.
Si ça peut vous donner une piste, mes liens générés grâce à l'aide de vue me renvoient "http://IpServeur/module/action" au lieu de "http://IpServeur/nomProjet/module/action".
PS : Ca ne marche pas avec "SetEnv ZF2_PATH /myfolder/anotherfolder/zendpath"
Dernière modification par Seryus (14-05-2014 11:08:09)
Hors ligne
pour le ZF2_PATH je te renvois vers la doc
http://framework.zend.com/manual/2.0/en … ation.html
ps: je suis désolé j'avais trouvé sur un fofo qu'il fallait le mettre dans htaccess, mais avec la doc ils disent httpd.conf
peut être un autre lien interessant :
http://framework.zend.com/blog/zend-fra … eased.html
Voila et si tout ça marche pas je peu te proposer une dernière bidouille:
essai de rajouter dans tes routes parents de tes modules '/nomProjet/'.
par exemple:
[lang=php] 'accueil' => '/nomProjet/', 'defaults' => array( 'controller' => 'IndexController', 'action' => 'index', ), 'user' => '/nomProjet/user[/:param]', 'defaults' => array( 'controller' => 'UserController', 'action' => 'fonctionuser', ),
Hors ligne
J'avais trouvé ça sur un forum pour remplacer le httpd.conf par le .htaccess :
RewriteEngine On RewriteRule ^\.htaccess$ - [F] RewriteCond %{REQUEST_URI} ="" RewriteRule ^.*$ /public/index.php [NC,L] RewriteCond %{REQUEST_URI} !^/public/.*$ RewriteRule ^(.*)$ public/$1 RewriteCond %{REQUEST_FILENAME} -f RewriteRule ^.*$ - [NC,L] RewriteRule ^public/.*$ /public/index.php [NC,L]
Le problème c'est que ça ne fonctionne que si le projet est à la racine du serveur. J'ai essayé d'enlever les "/" devant public pour avoir un lien relatif à l'emplacement actuel, ça me trouve l'index, mais j'ai le problème avec les routes, fichiers css/js.
Avec le "SetEnv ZF2_PATH", ça me retourne une page blanche.
La bidouille résout peut-être le problème des routes, mais je devrais modifier toutes les routes de mon application
Je remarque aussi que si j'essaie de suivre le lien "http://ipServeur/monProjet/public" j'obtiens une page avec seulement "run();" d'écrit. Peut-être qu'il me manque quelque chose sur le serveur ? Je me souviens avoir déjà eu ce problème il y a longtemps, mais pas moyen de retrouver une piste concernant celui-ci
Hors ligne
Mmmmhhh.. Pour l'instant je peu que te conseiller d'essayer d'installer un skeleton propre pour tester avant de migrer ton application, histoire de ne pas avoir d'interférence. (on sait jamais ^^)
(je te donne des news si je trouve une autre idée ^^)
EDIT : ah oui, ton serveur affiche-t-il toutes les erreurs? (des fois une page blanche peut cacher un Warning!)
EDIT 2 : bon, on peu faire une batterie de test :
dans index.php vérifie qu'il trouve bien les fichiers :
'init_autoloader.php'
et
'config/application.config.php'
un var_dump(file_exist(...)); suffira
et à la fin du fichier tu fais un die('ok');
Dernière modification par flobrflo (14-05-2014 14:29:59)
Hors ligne
Et sinon un lien symbolique ?
Hors ligne
Si j'ai bien compris il est obligé de bouger toute son application dans le sous dossier pour ne pas empiéter sur les autres projets en cours.
Hors ligne
Ca n'empêche pas de faire un lien symbolique sur le fichier index.php. De cette façon pas besoin de modifier le vhost et le serveur va bien appeler le bon fichier et normalement, dans ce cas, pas de problèmes avec les routes etc ...
Hors ligne
J'ai essayé le lien symbolique, ça m'affiche "run();"
Hors ligne
Personnellement j'ai utilisé le htaccess de zf2 dans un projet laravel une fois, et ca marchait pas mal...
Disons que tu doives mettre le site dans /var/www/site pour y acceder via http://toi.com/site.
Dans /var/www/site/.htaccess
<IfModule mod_rewrite.c> RewriteEngine On RewriteRule ^(.*)$ /public/$1 [L] </IfModule>
Puis dans /var/www/site/public/.htaccess (ton htaccess zf2, garde le plus de trucs dedans):
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} -s [OR] RewriteCond %{REQUEST_FILENAME} -l [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^.*$ - [NC,L] RewriteCond %{REQUEST_URI}::$1 ^(/.+)(.+)::\2$ RewriteRule ^(.*) - [E=BASE:%1] RewriteRule ^(.*)$ %{ENV:BASE}index.php [NC,L] </IfModule>
Note le rewrite base qui est important dans l'histoire
Hors ligne
En utilisant ces 2 .htaccess, il me dit qu'il n'arrive pas à trouver le dossier public. J'ai enlevé le "/" devant "public" dans le 1er .htaccess, et il m'affiche bien le site, mais même problème avec les routes/css/js.
J'arrive à reproduire le problème en local, il suffit simplement d'installer la Skeleton Application et de ne pas configurer de vhost. Puis, il faut essayer d'y accéder via http://127.0.0.1/monProjet (avec les fichiers .htaccess proposé ci-dessus).
Hors ligne
Tu dis que tu arrives a le reproduire en local, ca veut dire que tu as une version en ligne ? On peut avoir l'url ?
Utilises-tu $this->basePath() dans tes vues ?
Hors ligne
Je me suis mal exprimé, par "en local" je voulais dire sur mon pc avec Wamp. L'autre version est sur un réseau intranet. Oui j'utilise basePath, mais que pour une balise "<base>" qui se trouve dans mon layout.
Hors ligne
Pourrais-tu nous donner les erreurs que tu as dans ta console de developer tools ?
Au moins on aurait une idée des fichiers recherchés, et du coup du pourquoi ça marche pas...
Je n'ai jamais utilisé base dans mes devs, je ne saurai donc pas dire si c'est sensé marcher, ou si ça marche uniquement pour les images et liens...
Hors ligne
J'ai réussi à corriger quelques problèmes en faisant un "mix" de tout ce qui a été dit ici.
J'ai donc refait une installation au propre de la Skeleton application où j'ai ajouté mes modules et les dossiers contenant les images, css, js. Je n'ai plus le problème avec "run();" qui s'affichait.
Aussi j'ai mis les fichiers .htaccess que tu m'as donné en enlevant les "/" devant public, et j'arrive à accéder à mon application via "http://ipServeur/monProjet".
Par contre, les routes posent toujours problème (elles affichent l'url "http://ipServeur/controller/action" au lieu de "http://ipServeur/monProjet/controller/action").
Hors ligne
Salutation,
Pour tes routes, comme disais lobrflo, tu risque de devoir toute les réécrire...mais pour évité cela et garantir une portabilité maximum, je dirait de vérifier au niveau du bootstrap d'un module l'ip du serveur, et si elle correspond, récupérer la configuration de toute les route et de modifier toute les clé "route" en rajoutant devant "monProjet".
exemple bidon qui ne marchera pas mais juste pour illustrer ce que je veut dire:
[lang=php] function Bootstrap(){ if($_SERVER['SERVER_ADDR'] == 'ipServeur'){ //j'ai oublié comment récup la config mais imaginons ^^: $config = getConfig() ; foreach($config['router']['routes'] as $route){ $route['route']= '/monProjet/'.$route['route']; } } }
A voir selon la façons dont c'est configurer.
L'ideal serrai de créer un module, "moveUriRoot" par exemple, que l'on pourrai configurer de sorte a définir plusieurs racine possible selon plusieurs ip ou non de domaine.
Je pense que ce genre de module pourrai être utile pour beaucoup, j'ai moi même été confronté a ton problème et nous avons décidé de prendre le problème autrement : l'utilisation de sous domaine, mais on a pas tous accès à l'administration d'un serveur
Hors ligne
Je ne vais pas réécrire toutes les routes de mon application, ça devient problématique si je dois installer un nouveau module ou autre, je devrais à chaque fois modifier les routes
Tant pis si ce n'est pas possible, le site sera accessible via "http://ipServeur/monProjet/public".
Merci quand même !
Hors ligne
rhooo l'à pas tout lue! je te propose justement une solution pour ne pas les réécrit manuellement, mais bon as you want.
Hors ligne
Si si j'ai lu, mais d'après ce que j'ai compris ça revient aussi à modifier tout nouveau module
J'ai enfin résolu mon problème !
J'ai finalement pu avoir la main sur les fichiers conf du serveur.
Sous debian, dans apache/sites-availables je créé un fichier avec cette config, puis je l'active :
Alias /monProjet /var/www/monProjet/public SetEnv APPLICATION_ENV "development" <Directory "/var/www/monProjet/public"> DirectoryIndex index.php AllowOverride All Order allow,deny Allow from all </Directory>
Résultat, mon site est accessible via "http://ipServeur/monProjet/", les autres projets ne sont pas impactés, plus de problème de route ou de fichiers externes non trouvé !
Hors ligne
Aaaahh ba voila!
Ma solution c'était si tu n'avais pas accès a la config serveur: si tu débrouillai bien sur cette portion de code, tu n'avais a faire ce code que dans un seul module par exemple le module Application: quand tu parcours ta config depuis n'importe quel bootstrap, tu parcour TOUTE la config.
Mais du coup si tu a accès au config du serveur, pourquoi ne pas avoir tout simplement fait un sous domaine?
Hors ligne