Comment faire une redirection mod_rewrite vers une URL relative

J’essaie d’obtenir une redirection d’URL de base pour les jolies URL, et en raison des images, CSS etc. résidant également dans le même chemin, je dois m’assurer que si l’URL est accessible sans barre oblique, elle est ajoutée automatiquement.

Cela fonctionne bien si je mets l’URL absolue comme ceci:

RewriteRule ^myParentDir/([A-Z0-9_-]+)$ http://www.mydomain.com/myParentDir/$1/ [R,nc,L] 

Mais si je change cela en une URL relative, de sorte que je n’ai pas à le changer chaque fois que je déplace des choses dans des dossiers, cela ne fonctionne tout simplement pas.

Ce sont ce que j’ai essayé et tout ne fonctionne pas, ou me redirect vers le chemin de répertoire interne du serveur comme / public_html / …:

 RewriteRule ^myParentDir/([A-Z0-9_-]+)$ ./myParentDir/$1/ [R,nc,L] RewriteRule ^myParentDir/([A-Z0-9_-]+)$ myParentDir/$1/ [R,nc,L] 

Quelle est la bonne façon de faire une redirection d’URL pour que, si l’utilisateur entre quelque chose comme:

 http://www.mydomain.com/somedir/myVirtualParentDir/myVirtualSubdir 

il est redirigé vers (via HTTP 301 ou 302):

 http://www.mydomain.com/somedir/myVirtualParentDir/myVirtualSubdir/ 

Merci.

EDIT : Ajout de plus de détails car il ne semble pas être clair. Disons que je suis en train d’implémenter une galerie, et je veux avoir de jolies URL en utilisant mod_rewrite. Donc, je voudrais avoir les URL comme suit:

 http://www.mydomain.com/somedir/galleries/cats 

qui montre des vignettes de chats, tandis que:

 http://www.mydomain.com/somedir/galleries/cats/persian 

qui montre une image des vignettes de tous les chats, nommée persian. Donc, en réalité, la structure et la réécriture du répertoire physique seraient les suivantes:

 http://www.domain.com/somedir/gallery.php?category=cats&image=persian 

Donc, ce que je veux faire est de placer un fichier .htaccess dans / somedir qui intercepte toutes les requêtes faites à / galleries et selon les sous-répertoires virtuels qui le suivent, les utilise comme des espaces réservés dans la réécriture, avec 2 règles de réécriture:

 RewriteRule ^galleries/(A-Z0-9_-]+)/$ ./gallery.php?category=$1 [nc] RewriteRule ^galleries/(A-Z0-9_-]+)/+([A-Z0-9_-]+)$ ./gallery.php?category=$1&image=$2 [nc] 

Maintenant, le problème est que le script de la galerie a en fait besoin de CSS, de Javascript et d’images, disponibles sur http://www.domain.com/somedir/css , http://www.domain.com/somedir/js et http. : //www.domain.com/somedir/images respectivement.

Je ne veux pas coder en dur les URL absolues, donc les CSS, JS et Images seront référencées à l’aide d’URL relatives (./css, ./js, ./images, etc.). Je peux donc faire la réécriture des URL comme suit:

 RewriteRule ^galleries/[A-Z0-9_-]+/css/(.*)$ ./css/$1 [nc] 

Le problème est que, puisque http://www.domain.com/somedir/galleries/cats est un répertoire virtuel, ce qui précède ne fonctionne que si l’utilisateur tape:

 http://www.domain.com/somedir/gallaries/cats/ 

Si l’utilisateur omet la barre oblique finale, mod_dir ne l’appenda pas car, en réalité, ce répertoire n’existe pas.

Si je mets une réécriture avec l’URL absolue, cela fonctionne:

 RewriteRule ^galleries/([A-Z0-9_-]+)$ http://www.mydomain.com/subdir/galleries/$1/ [R,nc,L] 

Mais je ne veux pas que le préfixe d’URL soit codé en dur car je veux pouvoir le mettre sur n’importe quel domaine que je veux, quel que soit le sous-répertoire que je veux, alors j’ai essayé ceci:

 RewriteRule ^galleries/([A-Z0-9_-]+)$ galleries/$1/ [R,nc,L] 

Mais au lieu de cela, il redirige vers:

 http://www.mydomain.com/home/myaccount/public_html/subdir/galleries/theRest 

ce qui n’est évidemment pas ce que je veux.

EDIT: Précisions supplémentaires

La solution que je recherche consiste à éviter de coder en dur le nom de domaine ou les chemins de dossier dans .htaccess. Je suis à la recherche d’une solution où, si je compresse le fichier .htaccess avec le rest des scripts et des ressources, partout où l’utilisateur le décompresse sur son serveur Web, cela fonctionne parfaitement. Tout fonctionne comme ça en dehors de ce problème de slash.

Donc, toute solution impliquant le codage en dur du répertoire parent ou du chemin d’access du serveur Web dans .htaccess n’est en aucun cas ce que je recherche.

Voici une solution directement issue de la documentation Apache (sous “Problème de barre oblique”):

 RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^(.+[^/])$ $1/ [R] 

Voici une solution qui teste le REQUEST_URI pour une barre oblique finale, puis l’ajoute:

 RewriteCond %{REQUEST_URI} !(/$|\.) RewriteRule (.+) http://www.example.com/$1/ [R=301,L] 

Voici une autre solution qui vous permet d’exempter certains modèles de REQUEST_URI:

 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_URI} !example.php RewriteCond %{REQUEST_URI} !(.*)/$ RewriteRule ^(.*)$ http://domain.com/$1/ [L,R=301] 

J’espère que ces aide. 🙂

Cette règle devrait append une barre oblique à toute URL qui n’est pas un fichier / répertoire réel (ce qui est, je pense, ce dont vous avez besoin car Apache effectue généralement la redirection automatiquement pour les répertoires existants).

 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.+[^/])$ $1/ [L,R=301] 

Modifier:

Pour empêcher Apache d’append le chemin d’access relatif à la racine du document, vous devez utiliser RewriteBase. Ainsi, par exemple, dans le dossier destiné à être la racine de votre application, vous ajoutez les éléments suivants, qui remplacent le chemin physique:

 RewriteBase / 

Cela pourrait fonctionner:

 RewriteRule ^myParentDir/[A-Z0-9_-]+$ %{REQUEST_URI}/ [NS,L,R=301] 

Cependant, je ne sais pas pourquoi vous pensez avoir besoin de cela. Faites en sorte que votre règle de réécriture de fichiers CSS / JS / image ressemble à ceci:

 RewriteRule ^galleries/([A-Za-z0-9_-]+/)*(css|js|images)/(.*)$ ./$2/$3 

et tout devrait fonctionner /somedir/galleries/css/whatever.css que le navigateur demande /somedir/galleries/css/whatever.css ou /somedir/galleries/cats/css/whatever.css ou même /somedir/galleries/cats/persian/calico/css/whatever.css .

Ps. Un problème avec cette règle est qu’elle vous empêche d’avoir des noms de galeries “css”, “js” ou “images”. Vous voudrez peut-être résoudre ce problème en nommant ces répertoires virtuels quelque chose comme “.css”, “.js” et “.images”, ou en utilisant un autre schéma de nommage qui n’entre pas en conflit avec les noms de galerie valides.

Je ne suis pas sûr de bien comprendre votre problème.

La redirection des barres obliques se fait automatiquement sur la plupart des installations Apache à cause du module mod_dir (99% de chance que vous ayez le module mod_dir).

Vous devrez peut-être append:

 DirectorySlash On 

Mais c’est la valeur par défaut.

Alors. Si vous accédez à foo/bar et que bar n’est pas un fichier dans le répertoire foo mais un sous-répertoire, alors mod_dir effectue la redirection vers foo/bar/ .

La seule chose que je sache qui pourrait casser ceci est l’ Option Multiviews qui essaye peut-être de trouver un bar.php, bar.php, bar.a-mime-extension-knwon-by-apache dans le répertoire. Donc, vous pouvez essayer d’append:

 Option -Multiviews 

Et supprimez toutes les rewriteRules. Si vous n’obtenez pas ce comportement Apache par défaut, vous devrez peut-être examiner la mod-rewrite, mais c’est comme utiliser une bombe nucléaire pour tuer une araignée. Les bombes nucléaires peuvent devenir très délicates à utiliser correctement.

EDIT: Pour le problème de barre oblique avec mod-rewrite, vous pouvez vérifier ce document , en indiquant que cela devrait fonctionner:

 RewriteEngine on RewriteBase /myParentDir/ RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^(.+[^/])$ $1/ [R]