IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Apache Discussion :

[url rewriting] sous-domaine, dossier, uri, en variables


Sujet :

Apache

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 26
    Points : 16
    Points
    16
    Par défaut [url rewriting] sous-domaine, dossier, uri, en variables
    Bonjour,

    Je me casse les dents sur la config suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    RewriteEngine on
     
    RewriteCond %{HTTP_HOST} !^www.domaine.tl
    RewriteCond %{HTTP_HOST} ^([0-9a-zA-Z-]+).domaine.tl 
    RewriteRule ^([0-9a-zA-Z-]+)/index.php?([^.]+)$  /sortie/index.php?sous_domaine=%1&dossier=$1&$2 [L]
     
    RewriteCond %{HTTP_HOST} !^www.domaine.tl
    RewriteCond %{HTTP_HOST} ^([0-9a-zA-Z-]+).domaine.tl 
    RewriteRule ^([0-9a-zA-Z-]+)/$ /sortie/index.php?sous_domaine=%1&dossier=$1 [L]
     
    RewriteCond %{HTTP_HOST} !^www.domaine.tl
    RewriteCond %{HTTP_HOST} ^([0-9a-zA-Z-]+).domaine.tl 
    RewriteRule ^index.php?([^.]+)$ /sortie/index.php?sous_domaine=%1&dossier=none&$1 [L]
     
    RewriteCond %{HTTP_HOST} !^www.domaine.tl
    RewriteCond %{HTTP_HOST} ^([0-9a-zA-Z-]+).domaine.tl 
    RewriteRule ^$ /sortie/index.php?sous_domaine=%1&dossier=none [L]
    Objectifs :
    1. http://toto.domaine.tl => http://www.domaine.tl/sortie/index.p...o&dossier=none
    2. http://toto.domaine.tl/index.php?var1=XXXX&var2=XXXXX => http://www.domaine.tl/sortie/index.p...XXX&var2=XXXXX
    3. http://toto.domaine.tl/titi/ => http://www.domaine.tl/sortie/index.p...o&dossier=titi
    4. http://toto.domaine.tl/titi/index.ph...XXX&var2=XXXXX => http://www.domaine.tl/sortie/index.p...XXX&var2=XXXXX


    Le tout sans changer les URLs relatives à www.domaine.tl

    Résultats :
    1. http://toto.domaine.tl/ => /sortie/index.php?sous_domaine=toto&dossier=none : OK
    2. http://toto.domaine.tl/index.php?var1=toto => /sortie/index.php?sous_domaine=toto&dossier=none&n'importe quoi : KO
    3. http://toto.domaine.tl/titi/ => /sortie/index.php?sous_domaine=toto&dossier=titi : OK
    4. http://toto.domaine.tl/titi/index.php?var1=toto => /sortie/index.php?sous_domaine=toto&dossier=titi&n'importe quoi : KO


    Si un spécialiste pouvait m'ouvrir les yeux, je le remercie d'avance.

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    Les paramètres passés au niveau de l'URL (query string) ne se testent pas ainsi : une règle RewriteRule ne porte uniquement sur le chemin de la ressource. Pour tout le reste, il faut utiliser une condition RewriteCond, comme cela a été fait pour le nom du serveur. Toutefois, l'idée, par rapport à vos règles, étant, semble-t-il, de les retransmettre, il suffit simplement pour cela d'ajouter l'option QSA à la règle (Query String Append). Inutile de chercher à complexifier davantage.

    J'aurais corrigé/factorisé ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    RewriteEngine on
     
    RewriteCond %{QUERY_STRING} !(?:^|&)sous_domaine=[^&]+
    RewriteCond %{QUERY_STRING} !(?:^|&)dossier=[^&]+
    RewriteCond %{HTTP_HOST} !=www.domaine.tl
    RewriteCond %{HTTP_HOST} ^([0-9a-zA-Z-]+)\.domaine\.tl
    RewriteRule ^([0-9a-zA-Z-]+)/(?:index.php)?$ /sortie/index.php?sous_domaine=%1&dossier=$1 [L,QSA]
     
    #RewriteCond %{QUERY_STRING} !(?:^|&)sous_domaine=[^&]+
    #RewriteCond %{QUERY_STRING} !(?:^|&)dossier=[^&]+
    RewriteCond %{HTTP_HOST} !=www.domaine.tl
    RewriteCond %{HTTP_HOST} ^([0-9a-zA-Z-]+)\.domaine\.tl
    RewriteRule ^(?:index.php)?$ /sortie/index.php?sous_domaine=%1&dossier=none [L,QSA]

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 26
    Points : 16
    Points
    16
    Par défaut Je teste
    Merci pour la réponse rapide.

    Je viens de tester et j'ai une erreur 500.

    Je regarde d'où viens l'erreur.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 26
    Points : 16
    Points
    16
    Par défaut Ce n'est pas un simple passge de variables
    Url d'appel :
    http://toto.domaine.tl/rep/
    devrait devenir
    http://www.domaine.tl/sortie/index.php?sous_domaine=toto&dossier=rep

    http://toto.domaine.tl/index.php?var=toto&...
    devrait devenir
    http://www.domaine.tl/sortie/index.php?sous_domaine=toto&var=toto&...

    Or l'exemple permet le passage de variable dans la réécriture.

  5. #5
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    En effet, pour obtenir une "redirection de domaine", vos règles ne peuvent rester relatives : il faut préfixer les différents chemins de redirection de http://www.domaine.tl/

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 26
    Points : 16
    Points
    16
    Par défaut Avancement significatif
    Cette partie là fonctionne :

    RewriteCond %{QUERY_STRING} var1=(.+) [OR]
    RewriteCond %{QUERY_STRING} var2=(.+) [OR]
    RewriteCond %{HTTP_HOST} !^www.domaine.tl
    RewriteCond %{HTTP_HOST} ^([0-9a-zA-Z-]+).domaine.tl
    RewriteRule ^index.php?(.+)$ /autre-test/index.php?sous_domaine=%1&dossier=none&rq=index.php [L,QSA]
    RewriteRule ^([^/]+)$ /autre-test/index.php?sous_domaine=%1&dossier=none&rq=$1 [L,QSA]

    Part contre dès que je mets cette partie (pour les dossier) j'ai une erreur 500 :
    RewriteCond %{QUERY_STRING} var1=(.+) [OR]
    RewriteCond %{QUERY_STRING} var2=(.+) [OR]
    RewriteCond %{HTTP_HOST} !^www.
    domaine.tl
    RewriteCond %{HTTP_HOST} ^([0-9a-zA-Z-]+).
    domaine.tl
    RewriteRule ^([0-9a-zA-Z-]+)/index.php?(.+)$ /autre-test/index.php?sous_domaine=%1&dossier=$1&rq=index.php [L,QSA]
    RewriteRule ^([0-9a-zA-Z-]+)/([^/]+)$ /autre-test/index.php?sous_domaine=%1&dossier=$1&rq=$1 [L,QSA]



  7. #7
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    Regardez votre journal d'erreur : l'erreur 500 est liée à une boucle infinie de réécriture.

    Et il y a dans un premier temps des erreurs dans vos règles à corriger :
    • toutes les parties RewriteCond ne s'applique qu'à la RewriteRule qui suit immédiatement. Il faut donc dupliquer ces conditions, trouver le moyen de regrouper les adresses à réécrire remplissant les mêmes critères ou ruser.
    • Comme je l'ai initialement dit, vous ne pouvez pas faire référence à la partie appelée query string au niveau d'une règle RewriteRule qui ne porte que sur le chemin. Avec l'URL http://www.domaine.tl/sortie/index.php?sous_domaine=toto&dossier=rep, RewriteRule ne portera uniquement sur la partie mise en évidence (subtilité liée à l'usage de fichiers htaccess mise à part), le reste n'y apparaît pas. Activez le journal de réécriture si vous souhaitez le vérifier. (et puis de toute façon le motif est erroné en plusieurs points à en accepter par exemple http://toto.domaine.tl/toto/indexyphpnimportequoi)


    Le reste n'est qu'une question de logique : distinguer dans quel(s) cas il peut y avoir boucle et les écarter en conséquence (d'où ma proposition, parmi d'autres, de tester la présence - absence plutôt - du paramètre sous_domaine et dossier).

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 26
    Points : 16
    Points
    16
    Par défaut Solution et explication
    La solution :

    RewriteEngine on

    RewriteCond %{QUERY_STRING} var1=(.+) [OR]
    RewriteCond %{QUERY_STRING} var2=(.+) [OR]
    RewriteCond %{HTTP_HOST} !^www.domaine.tl
    RewriteCond %{HTTP_HOST} ^([0-9a-zA-Z-]+).domaine.tl
    RewriteRule ^([a-z]+/)?index.php?(.+)$ /autre-test/index.php?sous_domaine=%1&dossier=$1&rq=index.php [L,QSA]


    RewriteCond %{QUERY_STRING} var1=(.+) [OR]
    RewriteCond %{QUERY_STRING} var2=(.+) [OR]
    RewriteCond %{HTTP_HOST} !^www.domaine.tl
    RewriteCond %{HTTP_HOST} ^([0-9a-zA-Z-]+).domaine.tl
    RewriteRule ^([a-z]+/)?([^/]+)$ /autre-test/index.php?sous_domaine=%1&dossier=$1&rq=$2 [L,QSA]


    Explication pour ceux que ça intéresse :

    Le flag [OR] évite à la condition de sortir de la boucle, donc on peut concaténer les variables que l'on veut qu'elles existent ou non
    RewriteCond %{QUERY_STRING} var1=(.+) [OR]
    RewriteCond %{QUERY_STRING} var2=(.+) [OR]
    RewriteCond %{QUERY_STRING} var3=(.+) [OR]
    RewriteCond %{QUERY_STRING} var4=(.+) [OR]
    ........

    On ne traite pas les urls de la forme www.domaine.tl avec le !
    RewriteCond %{HTTP_HOST} !^www.domaine.tl

    On modifie REQUEST_URI avec RewriteRule.
    Par exemple :
    RewriteRule ^([a-z]+/)?([^/]+)$ /autre-test/index.php?sous_domaine=%1&dossier=$1&rq=$2 [L,QSA]
    Signifie que /toto/titi?var1=1 va être réécrit en
    /autre-test/index.php?sous_domaine=%1&dossier=toto/&rq=titi
    Les variables $1, $2 vont être remplacé par ce qui correspond dans les parenthèses
    Le ? indique que la variable peut exister. Par exemple ([a-z]+/)? signifie tous les caractères compris en a et z jusqu'à un '/' si cette suite de caractère existe.

    Dans le code ci-dessous il y a deux blocs qui semblent similaires. En fait ils servent à traiter les URLs contenant 'index.php' et celles qui le ne contiennent pas.
    Dans tous les cas la variable rq transmet le nom du fichier appelé donc on aura pu mettre que le second bloc.

    D'autre part il faut mettre ces blocs du plus contraignant vers le moi contraignant car le flag [L] indique que lors la réécriture est possible alors l'exécution est finie

    Information complémentaire le %1 correspond aux données extraites des conditions RewriteCond donc il est possible d'en avoir plusieurs et donc d'utiliser %1, %2,...

    J'ai tenté d'être le plus clair possible, mais bon ........

    Et merci encore à julp pour son aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [URL rewriting] Sous-domaine et multi-variables
    Par guillaumeIOB dans le forum Apache
    Réponses: 1
    Dernier message: 22/10/2012, 23h15
  2. [URL rewriting] Sous-domaine et variables d'URL
    Par cozy_cookie dans le forum Apache
    Réponses: 5
    Dernier message: 08/07/2010, 10h20
  3. Réponses: 2
    Dernier message: 16/04/2008, 15h27
  4. [URL REWRITING] Sous Domaine + Variables
    Par Early Reflexions dans le forum Apache
    Réponses: 3
    Dernier message: 28/12/2007, 01h58
  5. Réponses: 1
    Dernier message: 06/12/2007, 17h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo