Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 14-12-2007 13:22:48

Mr.MoOx
Administrateur
Lieu: Toulouse
Date d'inscription: 27-03-2007
Messages: 1444
Site web

Routage vers les modules/controller par sous domaines

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 smile

Hors ligne

 

#2 14-12-2007 14:01:15

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: Routage vers les modules/controller par sous domaines

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

 

#3 14-12-2007 14:25:30

Mr.MoOx
Administrateur
Lieu: Toulouse
Date d'inscription: 27-03-2007
Messages: 1444
Site web

Re: Routage vers les modules/controller par sous domaines

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 smile )

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. smile

Hors ligne

 

#4 14-12-2007 16:23:16

philippe
Administrateur
Lieu: Grenoble
Date d'inscription: 01-03-2007
Messages: 1624

Re: Routage vers les modules/controller par sous domaines

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


twitter : @plv ; kitpages.fr : Création de sites internet à Grenoble et Paris

Hors ligne

 

#5 14-12-2007 20:29:07

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: Routage vers les modules/controller par sous domaines

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

 

#6 15-12-2007 13:32:51

Mr.MoOx
Administrateur
Lieu: Toulouse
Date d'inscription: 27-03-2007
Messages: 1444
Site web

Re: Routage vers les modules/controller par sous domaines

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 smile

Hors ligne

 

#7 23-12-2007 13:02:38

Mikael31
Nouveau membre
Lieu: Toulouse
Date d'inscription: 23-12-2007
Messages: 4

Re: Routage vers les modules/controller par sous domaines

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:

Code:

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

Code:

http://controller.monsite.com/:action/*

à

Code:

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:

Code:

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/

Code:

[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

 

#8 30-12-2007 15:28:32

Mikael31
Nouveau membre
Lieu: Toulouse
Date d'inscription: 23-12-2007
Messages: 4

Re: Routage vers les modules/controller par sous domaines

Bon apparemment ça inspire personne :p

Hors ligne

 

#9 30-12-2007 19:46:15

Mr.MoOx
Administrateur
Lieu: Toulouse
Date d'inscription: 27-03-2007
Messages: 1444
Site web

Re: Routage vers les modules/controller par sous domaines

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

 

#10 12-01-2008 13:03:11

Mr.MoOx
Administrateur
Lieu: Toulouse
Date d'inscription: 27-03-2007
Messages: 1444
Site web

Re: Routage vers les modules/controller par sous domaines

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 smile

Pour l'instant mon plugin s'utilise ainsi:

Code:

$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 big_smile

PS: J'accepte les remarques sur le nom du plugin car c'est un peu long wink

Hors ligne

 

#11 13-01-2008 15:15:26

Mikael31
Nouveau membre
Lieu: Toulouse
Date d'inscription: 23-12-2007
Messages: 4

Re: Routage vers les modules/controller par sous domaines

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

 

#12 14-01-2008 00:10:47

Mr.MoOx
Administrateur
Lieu: Toulouse
Date d'inscription: 27-03-2007
Messages: 1444
Site web

Re: Routage vers les modules/controller par sous domaines

Code:

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

 

#13 14-01-2008 19:42:26

Mikael31
Nouveau membre
Lieu: Toulouse
Date d'inscription: 23-12-2007
Messages: 4

Re: Routage vers les modules/controller par sous domaines

Merci, je regarde ça bientôt...

Hors ligne

 

#14 15-01-2008 19:15:57

stephane
Membre
Lieu: Biot
Date d'inscription: 26-03-2007
Messages: 33
Site web

Re: Routage vers les modules/controller par sous domaines

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

 

#15 15-01-2008 21:00:45

Mr.MoOx
Administrateur
Lieu: Toulouse
Date d'inscription: 27-03-2007
Messages: 1444
Site web

Re: Routage vers les modules/controller par sous domaines

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 wink
On se tient au jus.

Hors ligne

 

#16 07-08-2008 19:06:38

sphax3d
Membre
Lieu: Calais, France
Date d'inscription: 14-05-2008
Messages: 12
Site web

Re: Routage vers les modules/controller par sous domaines

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

 

#17 13-10-2008 10:20:04

Mr.MoOx
Administrateur
Lieu: Toulouse
Date d'inscription: 27-03-2007
Messages: 1444
Site web

Re: Routage vers les modules/controller par sous domaines

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:

Code:

$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

 

#18 06-12-2008 14:08:38

yvann
Membre
Date d'inscription: 24-07-2008
Messages: 81

Re: Routage vers les modules/controller par sous domaines

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 smile

Hors ligne

 

#19 06-12-2008 14:10:57

Mr.MoOx
Administrateur
Lieu: Toulouse
Date d'inscription: 27-03-2007
Messages: 1444
Site web

Re: Routage vers les modules/controller par sous domaines

Si t'es en local j'ai envie de dire "et ton fichier hosts?" car y'a pas de magie smile
Sinon "et tes virtualhosts?"

Hors ligne

 

#20 06-12-2008 14:31:36

yvann
Membre
Date d'inscription: 24-07-2008
Messages: 81

Re: Routage vers les modules/controller par sous domaines

Je suis en mutualisé chez 1and1 smile sinon j'aurai certainement touché aux hosts effectivement ! merci pour ta rapidité !

Hors ligne

 

#21 06-12-2008 14:51:46

yvann
Membre
Date d'inscription: 24-07-2008
Messages: 81

Re: Routage vers les modules/controller par sous domaines

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

 

#22 06-12-2008 15:17:54

Mr.MoOx
Administrateur
Lieu: Toulouse
Date d'inscription: 27-03-2007
Messages: 1444
Site web

Re: Routage vers les modules/controller par sous domaines

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

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages