web-dev-qa-db-fra.com

Changement de structure de permalien - Les redirections dans htaccess cassent les liens d’archivage

Quand j'ai commencé avec mon blog, les permaliens et la structure suivante:

http://<domain>/%year%/%monthnum%/%day%/%postname%/

Il y a quelque temps, j'ai changé la structure de lien permanent en "http://<domain>/%postname%/" uniquement.

Afin de traiter les liens externes vers l'ancienne structure de permalien, j'ai ajouté la ligne suivante dans mon fichier htaccess:

RedirectMatch 301 /([0-9]+)/([0-9]+)/([0-9]+)/(.*)$ http://<domain>/$4

Maintenant, le problème est que la ligne de redirection rompt les liens d’archive, par exemple. "http://<domain>/2010/09/02" est redirigé vers la page d'accueil au lieu d'afficher les messages du 2 septembre 2010.

Est-il possible de corriger la directive de redirection dans htaccess, ou ne vais-je pas pouvoir manger le gâteau et l'avoir aussi?

2
TFM

RedirectMatch de Mod_Alias ​​n'est pas aussi puissant que Mod_Rewrite. Si vous avez Mod_Rewrite sur votre hôte (Pretty Permalinks en fait usage par exemple), vous pouvez effectuer la redirection uniquement si l'URL n'est pas au format de lien Archive.

Pour tester ce cas, il existe RewriteCond et pour effectuer la commande de redirection, il existe la directive RewriteRule ... [R=301] .

Un exemple basé sur vos données:

RewriteCond %{REQUEST_URI} !^/((20|19)[0-9]{2})/([0-9]{2})/[0-9]{2}$ [NC]
RewriteRule ^/([0-9]{4})/([0-9]{2})/([0-9]{2})/(.*)$ http://<domain>/$4 [R=301,L]

Ceci n’a pas été testé mais je pense que cela devrait faire le travail. J'ai utilisé un quantificateur ({2}) pour mieux spécifier le nombre de nombres que vous attendez. À côté de cela dans le RewriteCond, j'ai créé un motif qui ne correspond qu'aux années 20 et 19 ans.

La première ligne (la condition, RewriteCond) vérifie qu'elle ne correspond pas à une URL d'archive et que si elle ne correspond pas, la règle permettant d'effectuer la redirection sera exécutée. La RewriteRule fait fondamentalement la même chose que votre directive RedirectMatch.

2
hakre