web-dev-qa-db-fra.com

Htaccess redirige les pages d'un sous-dossier vers un répertoire racine tout en préservant les chaînes de requête

J'ai déplacé des pages de divers sous-répertoires vers le répertoire racine et je souhaite configurer une redirection 301 pour chaque page et conserver toute chaîne de requête pouvant être présente. Par exemple:

  • www.example.com/folder/page1.html sera redirigé vers: www.example.com/page1.html

et

  • www.example.com/folder2/page2.html sera redirigé vers: www.example.com/page2.html

Si une chaîne de requête est présente, que nous utilisons parfois, j'aimerais qu'elle soit préservée. Il y a plusieurs pages qui se trouvaient dans plusieurs sous-dossiers que je dois rediriger. Tous pourraient potentiellement avoir des chaînes de requête.

J'ai effectué des redirections simples pour les pages de destination où la page de destination contient une chaîne de requête définitive et peut coder en dur la chaîne de requête car elle sera toujours la même. Ce n'est pas le cas ici.

J'ai trouvé l'exemple suivant assez proche, mais je n'en comprends pas assez pour savoir s'il fonctionnera, et il se trouve qu'il n'y a qu'UN sous-dossier dont le contenu n'est pas déplacé, alors ...

RewriteEngine On
RewriteRule ^subfolder/(.*)$ /$1 [R=301,QSA,L] 
2
J Green
RewriteRule ^subfolder/(.*)$ /$1 [R=301,QSA,L]

Cela fonctionnerait très bien pour rediriger les fichiers tous au sein du sous-dossier spécifique. L'indicateur QSA n'est pas requis, car la chaîne de requête est conservée par défaut. L’indicateur QSA n’est requis que si vous avez inclus une chaîne de requête dans le substitution (c.-à-d. Le deuxième argument de la directive RewriteRule - l’URL cible] et que vous souhaitiez le requête d'origine sur la demande à être ajouté (Query String Append).

Toutefois, si vous souhaitez rediriger le sous-répertoire every sauf un, vous pouvez le faire en une seule règle en créant un exception pour le sous-répertoire que vous ne souhaitez pas rediriger.

Par exemple, en utilisant mod_rewrite dans .htaccess:

RewriteCond %{REQUEST_URI} !^/subdir-not-redirected/ [NC]
RewriteRule ^[^/]+/([^/]*)$ /$1 [R=302,L]

S'il ne s'agit que de fichiers .html que vous souhaitez rediriger, soyez plus précis avec la regex ...

RewriteRule ^[^/]+/([^/]*\.html)$ /$1 [R=302,L]

Cela correspond uniquement aux fichiers d'un seul sous-répertoire. Cela ne correspond pas aux fichiers de plus d'un sous-répertoire.

Ceci est une redirection 302 (temporaire). Passez à un 301 (permanent) uniquement lorsque vous avez confirmé que tout fonctionne correctement, afin d'éviter tout problème de mise en cache lors des tests.


En guise d'alternative, si vous n'avez aucune directive mod_rewrite existante, vous pouvez également le faire avec une seule directive mod_alias RedirectMatch:

RedirectMatch 302 ^/(?!subdir-not-redirected)[^/]+/([^/]*\.html)$ /$1

Ceci utilise un lookahead négatif pour créer une exception pour le sous-répertoire que vous ne voulez pas rediriger. (Vous pouvez utiliser la même méthode avec le RewriteRule ci-dessus, au lieu d'utiliser une directive séparée RewriteCond.)

1
MrWhite