Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Salut à tous.
Comme vous savez surement, avec le MVC du zf, les urls basiques vers les modules sont de la forme
http://www.monsite.com/:module/:controller/:action/*
Et moi, j'aimerais bien pouvoir avoir des urls de la forme
http://:module.monsite.com/:controller/:action/*
ou
http://:controller.monsite.com/:action/*
Avez vous une idée pour réaliser cela. Car là je vois pas du tout comment faire...
Merci
Hors ligne
pour ça il faut agir au niveau apache car http://:module.monsite.com/ c'est une destination DNS qui doit exister (*.monsite.com dans le DNS) et qui corresponds à un serveur virtuel Apache
dans ce cas il te faut dire que le serveut virtuel renvois vers ton dossier de ton appli et traiter dans le predispatch la récupération du module
pas simple du tout
A+JYT
Hors ligne
Ouuuha en effet. Le site sur lequel je voulais (car là j'ai plus trop envie) est sur mutualisé.
Mais je vais quand même voir si en bidouillant dans le predispatch je peux pas y arriver (on sait jamais )
Euh en faites, les sous domaine c'et pas le soucis, j'peux les faire pointé où je veux.
Et en bidouillant avec du htaccess je sais qu'on peux faire des sous domaines "virtuels". Testé et approuvé.
Donc ça va être possible si je m'en donne les moyens.
Hors ligne
Bonjour Mr. MoOx,
Le routeur ne touche absolument pas au serverName. Si tu veux faire ce genre d'opération, il faudra le faire à la main en triturant toi même le $_SERVER["SERVER_NAME"].
Sinon pour choisir le controlleur, je te conseille de regarder du coté d'un plugin, plutôt dans le routerShutdown() que dans le preDispatch(), ça t'évite de relancer le traitement à chaque fois que tu fais un $this->_forward...
A+, Philippe
Hors ligne
sans compter que la session est associé à un client et un domaine donc tu ne partagera pas tes objets de sessions entre deux module
Hors ligne
Merci de vos réponses,
Sur le coup, c'est plus pour faire des mini sites plus ou moins indépendant donc le problème de la session ne me dérange pas. Puis si vraiment j'ai besoin, je peux toujours utiliser des cookies
Hors ligne
Bonjour à tous,
Marrant de voir un topic si proche de ce que je cherche à faire. Ca pourra peut-être aider quelqu'un d'autre que moi...
Voilà ce qui m'intéresse:
http://controller.monsite.com/action/*
En fait j'aimerais que certaines parties de mon site soient accessibles sur des sous-domaines différents. J'ai pas trop envie d'utiliser des modules différents (ça m'embête pour l'accès aux ressources genre images, css, et javascripts).
Donc je pensais qu'un simple rewrite permettrait de passer de
http://controller.monsite.com/:action/*
à
http://www.monsite.com/controller/action/*
Mais je galère !
Je travaille en local sur un http://www.redesign-zend.fr, et je voudrais utiliser http://edition.redesign-zend.fr/action/, et le reecrire en http://www.redesign-zend.fr/edition/action/
Voilà mon .htaccess pour faire ça:
RewriteEngine on RewriteCond %{HTTP_HOST} !^www.* [NC] RewriteCond %{HTTP_HOST} ^([^\.]+)\.([^\/]*)(.*) RewriteRule ^(.*) www.%2/%1/$1 [L] # %2 contient le nom du site # %1 contient le nom du sous-domaine
Je sais qu'il est moche, mais ça marche... presque ! En effet, ça boucle mechamment. Voilà le compte rendu de debug dans mon log apache (activé avec "LogLevel debug" dans la conf de mon vhost), lorsque j'essaie d'accéder à http://edition.redesign-zend.fr/action/
[error] [client 127.0.0.1] Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary. Use 'LogLevel debug' to get a backtrace. [debug] core.c(3046): [client 127.0.0.1] r->uri = /www.redesign-zend.fr/edition/www.redesign-zend.fr/edition/www.redesign-zend.fr/edition/www.redesign-zend.fr/edition/www.redesign-zend.fr/edition/www.redesign-zend.fr/edition/www.redesign-zend.fr/edition/www.redesign-zend.fr/edition/www.redesign-zend.fr/edition/www.redesign-zend.fr/edition/action [debug] core.c(3052): [client 127.0.0.1] redirected from r->uri = /www.redesign-zend.fr/edition/www.redesign-zend.fr/edition/www.redesign-zend.fr/edition/www.redesign-zend.fr/edition/www.redesign-zend.fr/edition/www.redesign-zend.fr/edition/www.redesign-zend.fr/edition/www.redesign-zend.fr/edition/www.redesign-zend.fr/edition/action [debug] core.c(3052): [client 127.0.0.1] redirected from r->uri = /www.redesign-zend.fr/edition/www.redesign-zend.fr/edition/www.redesign-zend.fr/edition/www.redesign-zend.fr/edition/www.redesign-zend.fr/edition/www.redesign-zend.fr/edition/www.redesign-zend.fr/edition/www.redesign-zend.fr/edition/action [debug] core.c(3052): [client 127.0.0.1] redirected from r->uri = /www.redesign-zend.fr/edition/www.redesign-zend.fr/edition/www.redesign-zend.fr/edition/www.redesign-zend.fr/edition/www.redesign-zend.fr/edition/www.redesign-zend.fr/edition/www.redesign-zend.fr/edition/action [debug] core.c(3052): [client 127.0.0.1] redirected from r->uri = /www.redesign-zend.fr/edition/www.redesign-zend.fr/edition/www.redesign-zend.fr/edition/www.redesign-zend.fr/edition/www.redesign-zend.fr/edition/www.redesign-zend.fr/edition/action [debug] core.c(3052): [client 127.0.0.1] redirected from r->uri = /www.redesign-zend.fr/edition/www.redesign-zend.fr/edition/www.redesign-zend.fr/edition/www.redesign-zend.fr/edition/www.redesign-zend.fr/edition/action [debug] core.c(3052): [client 127.0.0.1] redirected from r->uri = /www.redesign-zend.fr/edition/www.redesign-zend.fr/edition/www.redesign-zend.fr/edition/www.redesign-zend.fr/edition/action [debug] core.c(3052): [client 127.0.0.1] redirected from r->uri = /www.redesign-zend.fr/edition/www.redesign-zend.fr/edition/www.redesign-zend.fr/edition/action [debug] core.c(3052): [client 127.0.0.1] redirected from r->uri = /www.redesign-zend.fr/edition/www.redesign-zend.fr/edition/action [debug] core.c(3052): [client 127.0.0.1] redirected from r->uri = /www.redesign-zend.fr/edition/action [debug] core.c(3052): [client 127.0.0.1] redirected from r->uri = /action
Je ne comprends pas pourquoi ça boucle, j'ai bien mis un [L] après ma règle de réécriture. Quelqu'un a-t-il une idée ?
Quand ceci marchera il me faudra faire une autre règle pour dire que tous les fichiers sont à prendre sur www.* et non pas sur le sous-domaine... Ca devrait pas être trop dur, mais je suis bloqué avant...
Merci,
Mikaël
Hors ligne
Bon apparemment ça inspire personne :p
Hors ligne
Le problème c'est que si tu passe par le rewrite, ça marchera pas comme tu fais je pense. Car le zf utilise les urls avant qu'elles soient rewrités. Donc si tu bidouille, le zf doit par marcher correctement.
Perso, j'ai pas trop pensé au problème des urls des images et cs (quoique là le rewrite devrait suffire).
Hors ligne
Voilà j'ai commencé à écrire mon plugin Rx_Controller_Plugin_RouteFromServerName. Pour l'instant, ça marche simplement à partir du sous domaine (donc sur un url du genre sub.loulou.fr, je vire loulou.fr et prend 'sub')
Vu que le code est pour l'instant assez simple, et que j'aime bien faire de code paramétrable+réutilisable je veux rajouter des options, pleins d'options Ouaaaisss!
Je vais vous poser quelques questions en vrac mélanger avec quelques explications afin de le coder au mieux.
- Es ce qu'un plugin ça suffit? Car pour l'instant le seul moment où je vois qu'on peux passer des options, c'est lorsque l'on enregistre le plugin - Zend_Front_Controller::registerPlugin(). Donc le paramètrage n'est modifiable que dans le bootstrap (mais peut être que ça suffit).
- Je voulais pouvoir le paramétré pour que ça marche pour module/controller/action/paramètre? Es ce que vous pensez que tou ça servira à quelqu'un ? Pour module et controller je n'en doute pas, pour les paramètres je pense aussi (ex: un site avec des utilisateurs pourra avoir des url du genre username.site.com (et ça ça claque hein? non? enfin perso je m'en servirais peut être ainsi pour un projet de site communtaire, ou site de blogs)
- Je pensais aussi à pourvoir réglé la partie du SERVER_NAME que l'on prend.
En effet il est possible d'avoir une application qui utiliserait plusieurs noms de domaine et il serait donc peut être intéressant de pouvoir se baser sur différente partie du nom si ce plugin est bien exploité (à noter qu'un sousdomaine peut contenir des '.')
Ex:
- :param.:module.site.com/:controller/:action
---> mr.moox.user.sitecommuntaire.com/profile/edit
---> wiki.sitecommuntaire.com/...
- :controller.site.com/:action
- :param.site.com/...
Enfin voilà je pense que certains vont penser que je suis parti en monotrip mais je pense qu'il est intéressant d'échanger nos idées sur ce point. Je veux peut être trop en faire. Il faut trouver la limite
Pour l'instant mon plugin s'utilise ainsi:
$fc->registerPlugin(new Rx_Controller_Plugin_RouteFromServerName('module/controller/action/username/...', bool $isParam=false))
Je pensais intégrer une notion de 'level' pour séléctionner la partie du sous domaine qu'on veux mais je sais pas trop comment m'y prendre (levelX.levelY...level2.level1).
Bon voilà me traiter pas de fou, c'est juste que je suisun peu trop ambitieux
PS: J'accepte les remarques sur le nom du plugin car c'est un peu long
Hors ligne
Hmm, t'as moyen de poster le code du plugin et un exemple d'instanciation ? Moi ça m'intéresse toujours, en tout cas.
Hors ligne
<?php /** * Rewix extension for Zend Framework * * LICENSE * * This source file is subject to the new BSD license that is bundled * with this package in the file LICENSE.txt. * It is also available through the world-wide-web at this URL: * http://www.rewix.com/license/new-bsd * If you did not receive a copy of the license and are unable to * obtain it through the world-wide-web, please send an email * to contact@rewix.com so we can send you a copy immediately. * * @category Rx * @package Rx_Controller_Plugin * @copyright Copyright (c) 2007 Rewix (http://www.rewix.com) * @license http://www.rewix.com/license/new-bsd New BSD License */ //require 'Zend/Controller/Plugin/Abstract.php'; /** * Rx_Controller_Plugin_RouteFromServerName * It's a plugin for set one part of the route from the MVC from subdomains of the server name * * @category Rx * @package Rx_Controller_Plugin * @copyright Copyright (c) 2007 Rewix (http://www.rewix.com) * @license http://www.rewix.com/license/new-bsd New BSD License */ class Rx_Controller_Plugin_RouteFromServerName extends Zend_Controller_Plugin_Abstract { /** * Partie de la route devant être prise du sous domaine... * * @var String */ private $_pieceOfRoute; /** * The piece name is it a parameter ? * * @var bool */ private $_isParam; /** * The piece name is it a parameter ? * * @var bool */ private $_overwrite; public function __construct($pieceOfRoute='module', $isParam = false, $overwrite=true) { $this->_pieceOfRoute = $pieceOfRoute; $this->_isParam = $isParam; $this->_overwrite = $overwrite; } public function routeShutdown(Zend_Controller_Request_Abstract $request) { //Explode servername to extract the subdomain name //I use the SERVER_NAME instead of HTTP_HOST because HTTP_HOST is based of the Host header is send bye the browser, so it will be modified... $explodeServerName = explode('.', $_SERVER["SERVER_NAME"]); //Take off the extension (.com, .eu...) array_pop($explodeServerName); //Take off the domain array_pop($explodeServerName); $value = implode('.',$explodeServerName); switch($this->_pieceOfRoute) { case 'module': case 'controller': case 'action': $fnNameEnd = ucfirst($this->_pieceOfRoute).'Name'; $fnGet = 'get'.$fnNameEnd; $fnSet = 'set'.$fnNameEnd; $original = $request->$fnGet(); if ($original == null || $this->_overwrite) { $request->$fnSet($value); } break; case 'param': $original = $request->getParam(); if ($original == null || $this->_overwrite) { $request->setParam($original, $value); } //break; //default: } } }
Hors ligne
Merci, je regarde ça bientôt...
Hors ligne
Je suis en train de bosser sur la même problématique (dans le but de déplacer la partie administration dans un module indépendant et dans un sous-domaine). D'ailleurs, j'avais noté les adresses suivantes (elles pourront sûrement vous intéresser) :
http://quessir.blogspot.com/2007/08/usi … -zend.html
http://www.nabble.com/map-domain-name-t … l#a9834678
http://www.nabble.com/Controllers-in-su … l#a7722116
Merci pour ton code Mr.MoOx, je vais regarder ça moi aussi.
Hors ligne
Je viens de pister tes liens. J'ai retenu quelques idées sympa. J'avais même pas penser à créer un router exprès. Là avec tout les éléments que j'ai, je vais concoter une bonne petite sauce
On se tient au jus.
Hors ligne
Hmm ! Ça m'intéresse tout ça !
Je trouve pourtant bizarre que la solution soit du côté ZF alors que d'après moi il faudrait plutôt jouer du côté de la réécriture des url dans la configuration du serveur web...
Du genre, pour un sous domaine admin : "" => "/index.php?module=admin" C'est pas possible ça ?
Enfin j'espère que depuis Janvier, vous en savez un peu plus :-° Merci de partager quelques explications ;-)
Edit : Mr.MoOx, j'ai quand même essayer ta solution et elle me parait convaincante :-) Il existe une nouvelle version de cette classe peut-être ? :-°
Dernière modification par sphax3d (08-08-2008 11:40:54)
Hors ligne
Le routage par nom de domain est maintenant possible avec la dernière version du ZF.
Mon pauvre plugin n'est donc plus utilisé au profit de la classe Zend_Controller_Router_Route_Hostname
Voici un exemple d'utilisation:
$hostRoute = new Zend_Controller_Router_Route_Hostname( ':username.domaine.me', array( 'module' => 'user', 'controller' => 'profil' ) ); //chainage avec une route normal $userRoute = $hostRoute->chain(new Zend_Controller_Router_Route(':controller/:action', array( 'module' => 'user', 'controller' => 'profil') ));
Hors ligne
Quelles modifications dans le .htaccess faut-il effectuer pour que le routage "hostname" fonctionne, j'ai beau le triturer, quand je change mon sous-domaine, inexorablement j'ai une erreur au niveau server "Le navigateur n'a pas pu trouver le serveur hôte pour l'adresse indiquée."
Merci
Hors ligne
Je suis en mutualisé chez 1and1 sinon j'aurai certainement touché aux hosts effectivement ! merci pour ta rapidité !
Hors ligne
En faite mon problème c'est que je pensais pas être obligé de créer chaque sous-domaine que j'utilise, peut-être n'est-ce pas le cas, mais actuellement c'est la seule façon que j'ai trouvé.
Hors ligne
Soit tu fais ca, soit tu met utilise un wildcard dns genre *.domain.com, mais là ca marchera meme si tu met n'importe quoi... à voir.
Perso sur mon site perso j'ai créer une section pour chaque sous domaines.
Hors ligne
Pages: 1