{Apache} mod_rewrite : règle pour "tout attraper" (chez OVH)

Bonjour,

Je cherche un moyen pour rediriger, sur mon hébergement OVH 90Plan toute requête (http://www.domaine.tld/*) vers le dossier “/www/site/*” sauf http://www.domaine.tld/admin/ qu’il faut rediriger vers le dossier “/www/backoffice/*”.

Pour le backoffice (l’administration) j’ai la règle :

RewriteRule admin(.*) /backoffice$1 [L,NC,QSA,NS]

qui semble bien fonctionner (http://www.domaine.tld/admin ou http://www.domaine.tld/admin/ me font tomber sur le dossier “/www/backoffice/”)

Par contre, pour le côté client du site (que l’URL http://www.domaine.tld fasse tomber sur “/www/”) :

RewriteRule ^(.*)$ /site/$1 [L,NC,QSA,NS]

(voire sans les “^” et “$”)
Ne fonctionne pas (j’obtiens une erreur HTTP 500).

La règle RewriteRule ^$ /site/ [L,NC,QSA,NS] fonctionnerait mais par contre, je n’arrive pas à rajouter des parenthèses englobante (pour capturer la suite de l’URL et la recoller après “/site/

Je précise que je n’ai pas de RewriteBase

Mon .htaccess est dans “/www/” (et il n’y en a pas dans “/”)

Vous auriez une solution ?

Si en plus vous sauriez comment faire pour que je puisse déplacer mes données hors du dossier “/www/” (mettre dans “/machin/”) faire pointer “http://www.domaine.tld/” vers “/machin/site/” et “http://www.domaine.tld/backoffice/” vers “/machin/backoffice/” ça serait bien :slight_smile:
Edité le 15/06/2008 à 13:03

Hum, question bête, “/site/$1” le slash ne fait pas échappement? J’serais tenté par tester un “/site/$1” mais j’dis peut-être nawak’ :confused:

Le caractère d’échappement c’est le \ et non le /, généralement.

Je crois que c’est plutôt l’autre slash (le ) qu’il faut escapper.

Heu si tu as accès à la conf Apache (et pas htaccess), pourquoi tu ne fais pas un alias directement? Ca t’évite de te faire chier avec mod_rewrite, hein :slight_smile:

genre:

Alias /admin /www/backoffice
<Directory /www/backoffice>
Order allow,deny
Allow from all
</Directory>

httpd.apache.org…

Pour le reste, n’oublie pas que les chemins sont normalement relatif au dossier où tu es.

RewriteRule admin(/.*)? /backoffice$1 [L,NC,QSA,NS]
RewriteRule (.*)?$ /site$0 [L,NC,QSA,NS]

Je suis d’accord, mais si tu appliques la règle suivante, tu as toujours une erreur?

RewriteRule (.*) /site/

Edit : J’avais pas lu le message de Sans-Nom. Juste, le dollar en fin de masque il doit pas être utilisé forcément avec l’accent circonflexe?
“RewriteRule (.*)?$ /site$0 [L,NC,QSA,NS]”
Edité le 15/06/2008 à 13:12

^ = début de ligne (soit début de pattern, en général)
$ = fin de ligne (soit fin de pattern, en général)

Oui, et je ne savais pas qu’on pouvait indiquer la fin sans préciser le début, je croyais que c’était pas obligatoire, mais que si on mettait l’un, fallait mettre l’autre. Autant pour moi.

Je vais mettre deux exemple le truc de wordpress :

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

et le truc du zend framework (http://framework.zend.com/manual/fr/zend.controller.html#zend.controller.quickstart.go.rewrite) :

RewriteEngine on
RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php

Je n’ai malheureusement pas accès aux directives Alias (si seulement…).

Dès que j’emploie un pattern qui contient i[/i] ça plante :-/.

Et le truc style Wordpress ca roule pas ?

Tu as essayé un masque sélectif?

([-/\._0-9a-z]*)?

Oublies pas le flag NC et je pense pas que tu aies besoin de plus pour tes urls, si?
Edité le 15/06/2008 à 17:59

Y a les # a gerer les ( ) aussi, les ? & enfin bon pas mal de trucs quand meme … donc je pense que ca risque d’etre assez galere de tout enumerer.

Enfin bref apres faut voir ce qu’il va y avoir comme site derriere.

Le masque sélectif fonctionne mieux :
RewriteRule ([-/._0-9a-z]*)? http://www.domaine.tld/site/abc$1 [L,NC,QSA,NS]
mais un appel à :
http://www.domaine.tld
renvoie sur :
http://www.domaine.tld/site/abcsite/abcsite/abcsite/abcsite/abcsite/abcsite/abcsite/abcsite/abcsite/abcsite/abcsite/abcsite/abcsite/abcsite/abcsite/abcsite/abcsite/abcsite/abcsite/abc
Edité le 15/06/2008 à 18:33

:non: Du moins pas pour les ? et les & sûr, pour les autres j’ai jamais testé mais je dirais que ça ne gène pas. L’UR s’applique à la requête URL, donc à l’appel du fichier, pour gérer les Query_String c’est le flag QSA qui s’en charge. Après pour les parenthèses, je m’en sers jamais dans des URL moi :confused:

Euh tu veux dire renvoies sur “/site/abcsite/abcsite/abcsite…” coté serveur non? Je vois pas comment il peut te ressortir l’url coté serveur dans l’url coté client :confused: Pourquoi dans ta règle tu lui demandes de t’envoyer vers l’URL coté client?

Si j’ai bien compris, il suffirait de faire une autre règle placée avant du genre :

RewriteRule ![-/\._0-9a-z]* /site/ [L,NC,QSA,NS]

Edité le 15/06/2008 à 19:22

Effectivement pas le ?, & et # mais bon y a pas mal de caractere autorisé dans une URL. Encore plus si tu veux gerer des URL unicode. Bref je trouve que la methode enumerative n’est jamais top …

Raynor >> ta Regle de rewrite fait un renvoie ?!

Je pense qu’elle a de l’intérêt dans de l’UR pure, mais pas de la redirection générale comme c’est le cas ici. Le principe d’énumérer permet de filtrer, donc bien entendu ça dépend de ce qu’on a besoin derrière :confused:

Hum oui j’ai pas compris là moi aussi Raynor :confused:

Non.

une url http c’est comme ça:

server:port…

En somme, tu n’auras jamais accès à la partie #identifier, et gràce à mod_rewrite, tu n’as pas à gérer le query_string (tu peux par contre faire des conditions dessus).

Quand je dis renvoi c’est que Apache reçoit l’adresse x et renvoi, au client, les données situées au chemin y
Dans l’idéal j’aimerai que ça soit transparent (que le visiteur ne voie pas domaine.tld/site/index.php dans sa barre d’adresse).

Ce que je souhaite faire c’est :
http://www.domaine.tld/admin/ => /www/backoffice/
http://www.domaine.tld/site/ => /www/site/
http://www.domaine.tld/ => /www/site/
Le tout en invisible au visiteur (enfin, surtout pour la dernière transformation)

J’ai bien compris, mais quand tu mets cette règle ça peut pas faire ce que tu veux :

Là tu lui dis :
Pour n’importe quel appel de page contenant les classes de caractères définies, je redirige vers http://www.domaine.tld/site/
Le plus pratique dans l’UR c’est que justement il y a cette part “d’invisible” au client. Et le but principal est un truc du genre :
Je detecte une adresse url coté client => Je renvoies le fichier ciblé par le htaccess

Normalement cette règle devrait fonctionner comme il faut, après je comprends pas si tu as des problèmes :

RewriteRule ([-/\._0-9a-z]*)? /www/site/abc$1 [L,NC,QSA,NS]
ou 
RewriteRule ([-/\._0-9a-z]*)? /site/abc$1 [L,NC,QSA,NS]

Là si tu ouvres avec ton browser “http://www.domaine.tld/def” il devrait te retourner une 404.