web-dev-qa-db-fra.com

Comment utiliser .htaccess pour réécrire différents domaines dans différents sous-répertoires, en masquant le sous-répertoire?

J'ai un plan d'hébergement partagé qui permet des domaines d'addon illimités, mais ils ne peuvent pointer que vers la racine publique (/). J'utilise .htaccess pour pointer différents domaines vers leurs sous-répertoires correspondants. Par exemple,

site1.com pointe sur le sous-répertoire /site1/
site2.com pointe sur le sous-répertoire /site2/

Je ne veux pas que l'utilisateur voie site1/ ou site2/. Mon .htaccess ci-dessous presque fonctionne. Si l'utilisateur va dans un sous-répertoire comme site2.com/test/ (remarquez le slash final /), cela fonctionne très bien. Mais si l'utilisateur omet la barre oblique finale, il affiche site2.com/site2/test/ dans le navigateur.

Ma question est donc la suivante: comment masquer le sous-répertoire, que l'utilisateur saisisse ou non la barre oblique finale?

Ma racine .htaccess ressemble à ceci (seulement avec plusieurs domaines, tous dans le même format de 3 lignes par domaine)

RewriteEngine On

RewriteCond %{HTTP_Host} ^(www.)?site1.com$ [NC]
RewriteCond %{REQUEST_URI} !site1/ [NC]
RewriteRule ^(.*)$ /site1/$1 [L]

RewriteCond %{HTTP_Host} ^(www.)?site2.com$ [NC]
RewriteCond %{REQUEST_URI} !site2/ [NC]
RewriteRule ^(.*)$ /site2/$1 [L]

J'ai essayé beaucoup de choses, provenant de différentes sources en ligne, mais rien ne fonctionne. Une chose qui a presque fonctionné (remarquez le slash final après $1):

RewriteRule ^(.*)$ /site2/$1/ [L]

Cela fonctionne correctement lorsque le nom du fichier est omis - site2.com/test/ - mais si vous accédez à site2.com/test/index.php, il indique "Aucun fichier d'entrée spécifié."

Le seul fichier à la racine est .htaccess, tout le reste est dans des sous-répertoires.

Modifier: réécrivez la question en omettant les détails non pertinents.

5
akTed

J'ai finalement trouvé une solution. le deuxième RewriteCond dans mon code ci-dessus était inutile, et le first RewriteRule ci-dessous, trouvé à Tips & Scripts de B & T , ajoute une barre oblique finale s'il n'en existe aucune (sauf s'il s'agit d'un fichier, comme index.php). Voici mon nouveau .htaccess. Notez que la directive à la fin de la barre oblique ne doit être appliquée qu'une seule fois.

.htaccess

RewriteEngine On

#ADD TRAILING SLASH TO DIRECTORY IF NONE EXISTS
RewriteRule ^([^\.]+[^/])$ http://%{HTTP_Host}/$1/ [L]

RewriteCond %{HTTP_Host} ^(www.)?site1.com$ [NC]
RewriteCond %{REQUEST_URI} !site1/ [NC]
RewriteRule ^(.*)$ /site1/$1 [L]

RewriteCond %{HTTP_Host} ^(www.)?site2.com$ [NC]
RewriteCond %{REQUEST_URI} !site/ [NC]
RewriteRule ^(.*)$ /site2/$1 [L]

Modifier

J'avais enlevé la deuxième RewriteCond de chaque triplet ci-dessus, et cela fonctionnait pour mon site principal + quelques autres. Je n'ai pas effectué de test complet et, plus tard, j'ai trouvé quelques autres domaines que je n'utilisais que très rarement (ne générant pas 500 erreurs internes). J'ai ajouté le second RewriteRule dans et ils fonctionnent à nouveau.

Ce qui est étrange, c’est qu’après avoir supprimé un de mes travaux de travail et les recréer, les réécritures (sans le second RewriteCond) a cessé de fonctionner (en jetant les 500 erreurs). L'ajout de la seconde RewriteCond l'a fait fonctionner à nouveau.

Oh, eh bien, je suppose que je vais attribuer cela à la magie de mod_rewrite... tant que ça marche.

4
akTed