.htaccess: redirige l’url racine vers le sous-répertoire, mais conserve l’url racine

Je suis en train de nettoyer la structure de répertoires de mon domaine (malheur à moi d’avoir configuré le contenu de l’URL racine dans le répertoire racine!) Et de savoir comment utiliser correctement RewriteRule.

L’essentiel

Je veux que domain.tld utilise domain.tld / sous-répertoire / mais apparaisse toujours comme domain.tld dans l’URL.

Mon .htaccess jusqu’ici

Options +FollowSymlinks RewriteEngine On #Force removal of wwww subdomain RewriteBase / RewriteCond %{HTTP_HOST} ^www.domain.tld RewriteRule ^(.*)$ http://domain.tld/$1 [R=301,L] #Trailing slash RewriteRule ^/*(.+/)?([^.]*[^/])$ http://%{HTTP_HOST}/$1$2/ [L,R=301] #Redirect root url to subdirectory RedirectMatch 301 ^/subdirectory/$ http://domain.tld/ RewriteRule ^/$ /subdirectory/?$ [L] 

Le RedirectMatch fonctionne très bien. Malheureusement, le dernier RewriteRule ne devrait pas suffire, mais ce n’est pas le cas. L’ancienne configuration du contenu dans le répertoire racine apparaît toujours.

Qu’est-ce que j’oublie ici?

Mise à jour: résolu

Solution simple que je ne suis pas assez expérimenté avec le .htaccess / apache pour pouvoir expliquer pourquoi.

J’avais:

 RewriteRule ^/$ /subdirectory/?$ [L] 

Enlever la barre oblique fixe tout:

 RewriteRule ^$ /subdirectory/?$ [L] 

Alors maintenant ma question est: pourquoi est-ce?

Essaye ça:

 RewriteEngine on RewriteBase / RewriteCond %{REQUEST_URI} !^/subdirectory/ # REWRITES ALL URLS # [REPLACE "domain" WITH THE ACTUAL DOMAIN, # WITHOUT THE TLD (.com, .net, .biz, etc)] RewriteCond %{HTTP_HOST} ^(www\.)?domain\. # REWRITE ALL THOSE TO subdirectory RewriteRule ^(.*)$ /subdirectory/$1 [L] 

BR Spiros

La partie de l’URI dans un RewriteRule ne contient pas la barre oblique précédente.

Donc, pour correspondre à http://example.com/ vous devez utiliser RewriteRule ^$RewriteRule ^/$ correspondrait théoriquement à http://example.com// (notez une double barre oblique).

Additional:? ?$ À la fin n’a pas de sens, car cela appendait une chaîne de requête avec un paramètre vide $ .

Enfin, vous avez: RewriteRule ^$ /subdirectory/ [L,QSA]

Les deux règles sont valides :

Celui-ci doit être utilisé dans la configuration du serveur ou dans le contexte de l’hôte virtuel (l’ URL commence par une barre oblique ):

 RewriteRule ^/$ /subdirectory/ [L] 

Si vous placez la même règle dans .htaccess , vous devez supprimer la première barre oblique ( car elle est relative au dossier actuel ):

 RewriteRule ^$ /subdirectory/ [L] 

PS Floern a déjà mentionné à propos ?$ partie URL cible. Pas besoin de $ du tout. Si vous terminez votre URL avec ? cela indique à Apache de ne pas transférer la chaîne de requête vers une nouvelle URL (supprimer complètement la chaîne de requête).

En outre, l’indicateur [QSA] est requirejs uniquement si vous manipulez avec la chaîne de requête (avez ? Dans l’URL cible) et souhaitez toujours que votre chaîne de requête actuelle soit ajoutée à l’URL nouvellement créée. Cela signifie que dans cette règle RewriteRule ^$ /subdirectory/ [L,QSA] le drapeau [QSA] ne fait rien du tout et peut être supprimé en toute sécurité.

J’ai essayé la solution mais dans mon cas, supprime le dossier / BUT affichant l’ancien site (www.site.it) et non le site http://www.site.it/folder/ avec ‘folder’ supprimé … j’ai copié et collé le même code mais ne fonctionne pas dans mon cas 🙁 j’ai ouvert un nouveau sujet: .htaccess: redirect l’url wordpress root vers un autre wordpress dans un sous-répertoire, mais conserver l’url racine