web-dev-qa-db-fra.com

htaccess rewrite pour déplacer l'id numérique de l'avant de l'URL à la fin et supprimer le ".html"

J'ai un problème de migration de site et d'anciens liens. Désormais, ce n’est pas seulement une migration de serveur, c’est aussi une migration de CMS. Le site est passé de umbraco (asp.net) à wordpress. Le problème est que Google a indexé les anciennes URL. Nous avons un moyen de retravailler les liens pour les faire fonctionner. J'utilise cette méthode pour retravailler les liens et utilise le plugin WP pour la redirection. Le problème est qu'il y a beaucoup de liens pour ce plugin.

Je me demandais s'il y avait un moyen de retravailler les liens de manière dynamique avec htaccess. Alors, voici comment les liens doivent être réécrits:

http://example.com/something/XXXXX-some-text.html
-->
http://example.com/something/some-text-XXXXX
where XXXXX is some number between 100 and 100,000

Cette méthode fonctionne, le seul problème est qu'il y a plus de 60 000 liens ...

Aucune suggestion?

P.S. Il y a aussi quelques autres liens qu'il faut ignorer, car nous n'avons pas le moyen de les retravailler ...

2
klo

http://example.com/something/XXXXX-some-text.html
-->
http://example.com/something/some-text-XXXXX
où XXXXX est un nombre compris entre 100 et 100 000

Je suppose que "100 000" n'a pas littéralement une virgule? Et j'ai supposé que le trait d'union (-) après le nombre est littéral, il est donc numéro suivi d'un seul trait d'union, suivi de <some-text>. Et que <some-text> ne peut se composer que de lettres majuscules/minuscules, de chiffres et de traits d'union. Ou est-ce censé être XXXXX<sometext>.html?

Vous pouvez essayer quelque chose comme ce qui suit dans votre fichier .htaccess racine. Ceci doit être passé avant toute réécriture de WordPress.

RewriteRule ^(something)/(\d{3,6})-([a-zA-Z0-9-]+)\.html /$1/$3-$2 [R=302,L]

Cela transmettra également la chaîne de requête à partir de la demande d'origine. Si la chaîne de requête doit être supprimée, ajoutez un ? à la fin de la substitution RewriteRule (ou incluez l'indicateur QSD si vous utilisez Apache 2.4).

Le nombre dans l'expression régulière est littéralement juste une chaîne de chiffres comprise entre 3 et 6 caractères (inclus). Ce n'est pas littéralement 100 à 100 000 en chiffres.

Il s’agit actuellement d’une redirection 302 (temporaire), ce qui facilite les tests car elle n’est pas mise en cache par le navigateur. Changez-le en 301 (permanent) lorsque vous êtes sûr que tout fonctionne correctement.

P.S. Il y a aussi quelques autres liens qu'il faut ignorer, car nous n'avons pas le moyen de les retravailler ...

Si certaines URL suivent ce modèle mais doivent être ignorées, vous devrez créer des exceptions - une condition (RewriteCond) précédant cette règle. Quelque chose comme:

RewriteCond %{REQUEST_URI} !^/something/123-exclude-this\.html
RewriteCond %{REQUEST_URI} !^/something/456-and-exclude-this\.html
RewriteRule ^(something)/(\d{3,6})-([a-zA-Z0-9-]+)\.html /$1/$3-$2 [R=301,L]

Ou, s'il existe un motif pour les URL qui doivent être ignorées, celles-ci peuvent être combinées avec une expression rationnelle appropriée.

Le préfixe ! du CondPattern (2e argument de la directive RewriteCond) annule la regex. Donc, le jeu de règles ci-dessus dit en gros, si la demande correspond au modèle indiqué et n’est pas ceci ou que puis redirige.


EDIT: Si "quelque chose" est variable, vous pouvez alors mettre chaque alternative dans le modèle RewriteRule:

RewriteRule ^(category/subcategory|category/sub/subsub)/(\d{3,6})-([a-zA-Z0-9-]+)\.html /$1/$3-$2 [R=301,L]

Ou, en fonction de vos URL (et de l'existence éventuelle de conflits), vous pouvez le rendre entièrement générique:

RewriteRule ^(.+)/(\d{3,6})-([a-zA-Z0-9-]+)\.html$ /$1/$3-$2 [R=301,L]

Les $1, $2 et $3 sont des références arrière aux sous-modèles entre parenthèses (groupes capturés) dans le modèle RewriteRule. Ainsi, $1 est remplacé par tout ce que (.+) correspond dans le chemin URL.

1
MrWhite