Sous domaines -pages non interpretées -> code source affi

Nouveau WRInaute
Bonjour a tous,

J'utilise actuellement une règle (qui fonctionne mais peut être n'est elle pas la meilleure car je suis pas très bon en mod_rewrite) qui permet de rediriger une requete foo.site.com vers le repertoire users/foo.

RewriteCond ${lowercase:%{HTTP_HOST}} !^$
RewriteCond ${lowercase:%{HTTP_HOST}} !^www\.site.com$
RewriteCond ${lowercase:%{HTTP_HOST}} ^(www\.|)([^.]+)\.site\.com$
RewriteRule ^(.+) ${lowercase:%{HTTP_HOST}}$1 [C]
RewriteRule ^(www\.|)([^.]+)\.site\.com(.*) /users/$2$3 [C]

Actuellement donc la page foo.site.com/archive.html est chargée à partir de users/foo/archive.html

Je souhaite maintenant effectuer la manip suivante :
tous les repertoires demandés sur foo.site.com doivent correspondre à l'exemple ci-dessous :

foo.site.com/article/ -> /dyn/get.php?site=foo&template=article
foo.site.com/dossier/ -> /dyn/get.php?site=foo&template=dossier

Quelle serait alors la commande ? J'imagine que c'est une suite aux RewriteRule ci-dessus( et que la ligne doit se terminer par [L] )


De plus, j'utilise également des pages ColdFusion, et lorsque j'applique des régles de réecritures du genre foo.html -> foo.cfm, la page restituée est le code source de la page ColdFusion !
Alors que cette page se trouve dans un repertoire ou tout fichier cfm est interprété par Coldfusion. Cela ne se produit pas pour PHP par contre.


Merci beaucoup pour votre aide et bravo pour le contenu de ce site.

Jiib75
 
WRInaute occasionnel
Alors, si j'ai bien compris

Code:
RewriteCond %{HTTP_HOST}	!^www\.site.com$ [NC]
RewriteCond %{HTTP_HOST}	^[^.]+\.site\.com$ [NC]
RewriteRule ^(.+)		%{HTTP_HOST}$1          [C]
RewriteRule ^([^.]+)\.site\.com/([^\/]+)\/$	/$1/dyn/get.php?site=$1&template=$2          [PT,L] 
RewriteRule ^([^.]+)\.site\.com/(.*)		/$1/$2          [L]

J'ai retiré les lowercase essentiellement parce que mon système ne veut rien savoir et qu'ils peuvent être remplacés par [NC] dans les RewriteCond.

J'ai pris pour hypothèse que seuls les appels de répertoire devaient être passés au script et que les appels de fichiers continuaient leur route vers le système, et que chaque sous-domaine avait son fichier get.php. En gros, quand on appelle un répertoire à la racine, c'est transféré au fichier php, pour le reste, c'est le fichier sur le disque correspondant. On peut bien entendu faire autrement.

Le flag PT dans la deuxième transformation est là pour les appels ColdFusion, il sert à donner la main à d'autres modules après réécriture. C'est peut-être la solution à ton problème d'affichage de source.

J'ai bon?
 
Nouveau WRInaute
Bravo ! encore un petit détail :)

Merci mille fois nikoshr ! Tu as tout bon !

Cela fonctionne bien en effet, et je n'ai plus de probleme d'affichage des sources.
La règle de réécriture des urls fonctionne également (tu as même simplifié les choses)

Par contre maintenant, j'ai un probleme avec les liens à l'interieur des pages dynamiques, qui ne sont plus valides lorsqu' il y a le sous domaine devant :


Voici l'une des règles basée sur ton exemple que j'utilise :
Code:
RewriteRule ^([^.]+)\.site\.com/message/([^\/]+)\/$ /cfm/tools/comments/?bid=$1&pid=$2 [PT,L]

se traduit par :
foo.site.com/message/num/ -> cfm/tools/comments/?bid=foo&pid=num

Pour remédier au problème, j'ai pensé à 2 solutions :

1. Réecrire l'url avec l'adresse www complète, mais je n'arrive pas à ce qu'elle soit masquée par le navigateur.
Voici alors mon code :

Code:
RewriteRule ^([^.]+)\.site\.com/message/([^\/]+)\/$ http://www.site.com/cfm/tools/comments/?bid=$1&pid=$2 [L]

2. Indiquer un truc du genre :

Code:
RewriteRule ^([^.]+)\.site\.com/(.*) /$2 [L]

Pour que 8.site.com/image.gif soit cherché dans le bon répertoire, mais du coup ca fout en l'air la règle qui allait chercher dans le repertoires des utilisateurs les fichiers html (cf premier post) :
Code:
RewriteRule ^([^.]+)\.site\.com/(.*) /users/$1/$2 [L]

Que me conseille tu ? As tu d'autres pistes ?
Merci encore !!

Jiib
 
WRInaute occasionnel
La première solution force une redirection puisque tu indiques un domaine complet.

Je pense que la solution est d'écrire un autre bloc de règles qui réécrira les URL pour tous les sous-domaines, y compris www.

Ca donne
Code:
RewriteCond %{REQUEST_URI}   ^\/message/[^\/]+\/$ [NC]
RewriteRule ^(.+)	%{HTTP_HOST}$1          [C] 
RewriteRule ^([^.]+)\.site\.com/message/([^\/]+)\/$ /cfm/tools/comments/?bid=$1&pid=$2 [PT,L]


RewriteCond %{HTTP_HOST}   !^www\.site.com$ [NC] 
RewriteCond %{HTTP_HOST}   ^[^.]+\.site\.com$ [NC] 
RewriteRule ^(.+)      %{HTTP_HOST}$1          [C] 
RewriteRule ^([^.]+)\.site\.com/([^\/]+)\/$   /$1/dyn/get.php?site=$1&template=$2          [PT,L] 
RewriteRule ^([^.]+)\.site\.com/(.*)      /$1/$2          [L]

Suivant ce que tu veux faire, il est possible que la règle sur get.php dans le deuxième bloc devienne obsolète.
 
Nouveau WRInaute
Ca marche ! Est-ce correct ?

Merci encore pour la rapidité de ta réponse.

Voici mes règles finales, j'ai ajouté un bloc (2eme) pour le repertoire users, car le dernier bloc ne suffisait pas.

Voici une description de ce que fait chaque bloc :

Pour ces 3 blocs, la condition est que ce doit être un sous-domaine. (et pas www)

1. Pour un URL foo.com/message/xxx ou foo.com/message/xxx/ renvoie vers un script coldfusion.

2. Pour un URL foo.com/xxx.xxx (page html, image, etc) renvoie vers le repertoire users ou sont stockés les document statiques

3. Pour tout le reste, renvoie vers le repertoire qui aurait été utilisé pour www



Code:
RewriteCond %{HTTP_HOST}   !^www\.site.com$ [NC] 
RewriteCond %{HTTP_HOST}   ^[^.]+\.site\.com$ [NC]
RewriteCond %{REQUEST_URI}   ^\/message/(.*) [NC] 
RewriteRule ^(.+)   %{HTTP_HOST}$1          [C] 
RewriteRule ^([^.]+)\.site\.com/message/([^\/]+) /cfm/tools/comments/?bid=$1&pid=$2 [PT,L] 
RewriteRule ^([^.]+)\.site\.com/(.*)      /$2          [L]

RewriteCond %{HTTP_HOST}   !^www\.site.com$ [NC] 
RewriteCond %{HTTP_HOST}   ^[^.]+\.site\.com$ [NC]
RewriteCond %{REQUEST_URI}   ^\/[^\/]+\.[^\/]+$ [NC] 
RewriteRule ^(.+)   %{HTTP_HOST}$1
RewriteRule ^([^.]+)\.site\.com/(.*) /users/$1/$2 [L]


RewriteCond %{HTTP_HOST}   !^www\.site.com$ [NC] 
RewriteCond %{HTTP_HOST}   ^[^.]+\.site\.com$ [NC] 
RewriteRule ^(.+)      %{HTTP_HOST}$1          [C] 
RewriteRule ^([^.]+)\.site\.com/(.*) /$2 [L]

Est-ce correct ?

En tout cas, ca fonctionne, peut-être que l'on peut simplifier encore, ou qu'il y a un cas que je n'ai pas vu..

Merci encore, je n'y serai pas arrivé sans ton aide !

Jiib
 
WRInaute occasionnel
Si ca marche, c'est correct :)
On peut essayer de nettoyer un peu, mais c'est juste pour des points de style.

Code:
RewriteCond %{HTTP_HOST}   ^www\.site\.com$ [NC]
RewriteRule .*   -          [L] 

RewriteCond %{REQUEST_URI}   ^\/message\/(.*) [NC] 
RewriteRule ^(.+)   %{HTTP_HOST}$1          [C] 
RewriteRule ^([^.]+)\.site\.com/message/([^\/]+) /cfm/tools/comments/?bid=$1&pid=$2 [PT,L] 

RewriteCond %{REQUEST_URI}   ^\/[^\/]+\.[^\/]+$ [NC] 
RewriteRule ^(.+)   %{HTTP_HOST}$1 [C]
RewriteRule ^([^.]+)\.site\.com/(.*) /users/$1/$2 [L]

Il manquait un chainage avec la règle de réécriture dans le bloc users. Donc :

1/ tout ce qui passe par www n'est pas réécrit, on ne fait rien (le tiret dans la règle) et on dégage
2/ si on croise une URL avec /message/ dedans, on envoie ca vers ColdFusion. J'ai retiré la deuxième ligne qui ne faisait que remettre l'URL dans l'état initial, ce qu'on peut éviter avec les conditions ad hoc. Mais j'ai peut-être oublié un cas.
3/ si c'est un fichier à la racine, il est appelé dans le répertoire users correspondant
4/ dans tous les autre cas, on ne fait rien, donc pas de règle

Je n'ai pas testé, il y a (probablement) des choses à rectifier.
 
Discussions similaires
Haut