Wordpress: Redirections des anciens urls via .htaccess

WRInaute discret
Sous Wordpress je viens de changer la structure de mes permaliens.
Auparavant j’avais cette structure de permalien:
Code:
/%year%/%monthnum%/%day%/%postname%.html

je viens de changer la structure des permaliens pour celle-ci:
Code:
/%category%/%postname%-%post_id%.html

Comment faire via .htaccess une redirection globale de mes anciennes urls vers les nouvelles ?
J'ai tenté ceci mais ça ne marche pas:
Code:
RedirectMatch 301 ^/([0-9]{4})/([0-9]{2})/([0-9]{2})/(.*)$ http://www.exemple.com/$4

Merci d’avance.
 
WRInaute discret
Tu ne saurais pas car tu n'as ni le %category% ni le %post_id% dans ton ancienne url.
Il faut passer par php malheureusement, et vérifier en base de données si l'url appelée est à l'ancien format et rediriger vers le nouveau avec les bons paramètres trouvés en DB.
 
WRInaute discret
Merci pour la réponse.
C'était pour éviter des centaines d'erreurs 404 en changeant la structure des permaliens.
Mais je voudrais vraiment passer de la structure
Code:
/%year%/%monthnum%/%day%/%postname%.html
à la structure
Code:
/%category%/%postname%-%post_id%.html
.
Quitte à rediriger manuellement url par url.
 
WRInaute discret
En effet c'est assez embêtant pour le référencement.

Soit tu ne changes pas tes urls.
Soit tu les changes de manière plus intelligente de façon à pouvoir les rediriger (en ayant les paramètres nécessaires).
Soit tu fais comme tu as demandé mais tu devras passer par php (avec vérification en base de données -> pas terrible si tu veux mon avis de solliciter la DB pour ça...)
Soit tu le fais au cas par cas (vraiment pas dynamique ni générique) -> dans ce cas, courage :)
 
WRInaute discret
Bon j’ai trouvé tout seul à force de m'entêter. Je suis persuadé que cela va aider d’autres.
Quand on passe de cette structure de permalinks:
Code:
/%year%/%monthnum%/%day%/%postname%.html
à celui-ci:
Code:
/%category%/%postname%-%post_id%.html
Voilà le code à mettre en htaccess
Code:
RedirectMatch 301 ^/([0-9]{4})/([0-9]{2})/([0-9]{2})/([^/]+).html$ http://site.com/$1/$4-$2.html

$1: me donne les catégories
$4: le titre du post
$2: l'id du post

Je vous remercie d'avoir essayer de m'aider c'est cool.
 
WRInaute discret
Je dois bien avouer que j'ai du mal à croire que ce que tu dis fonctionne.

En effet, le paramètre 1 ($1) correspond à l'année (%year%), le paramètre 2 ($2) correspond au mois (%monthnum%) et le paramètre 4 ($4) correspond au nom du post (%postname%).

Alors soit %year% correspond à la catégorie et %monthnum% à l'ID du post (ce dont je doute fort), soit c'est complètement faux.
 
WRInaute discret
En effet. Par contre, ayant un doute que cela s'effectue bien par la simple action du saint esprit, j'ai analysé les entêtes HTTP pour visualiser les redirections qui se produisent, voici le résultat:

J'accède à
http://www.soninkara.org/2013/10/03/histoire-de-gory-village-soninke-du-diafounou-partie-3.html
Réponse HTTP:
GET /2013/10/03/histoire-de-gory-village-soninke-du-diafounou-partie-3.html HTTP/1.1
HTTP/1.1 301 Moved Permanently
Location: http://www.soninkara.org/2013/histoire-de-gory-village-soninke-du-diaf ... -3-10.html

Donc déjà, à partir d'ici, je n'ai aucune idée d'où vient cette redirection. En tout cas, elle ne figure pas dans ton htaccess, j'en déduis donc que cela se produit côté PHP (tu travailles avec quel framework ?).

Ensuite, on est donc redirigé vers
http://www.soninkara.org/2013/histoire-de-gory-village-soninke-du-diafounou-partie-3-10.html
Réponse HTTP:
GET /2013/histoire-de-gory-village-soninke-du-diafounou-partie-3-10.html HTTP/1.1
HTTP/1.1 301 Moved Permanently
Location: http://www.soninkara.org/histoire-soninke/histoire-de-gory/histoire-de ... -4383.html

Nouvelle redirection, cette fois-ci vers l'url que tu m'as donnée.
En gros, je pense simplement que la règle de ton htaccess est inutile et que ton framework gère les redirections pour toi selon les changements de format des urls que tu fais. Car l'id du post (ici 4383) sort de nulle part, ainsi que d'autres paramètres.
 
WRInaute discret
En gros, je pense simplement que la règle de ton htaccess est inutile et que ton framework gère les redirections pour toi selon les changements de format des urls que tu fais. Car l'id du post (ici 4383) sort de nulle part, ainsi que d'autres paramètres.
Je veux bien te croire, je t'assure. Je veux comprendre aussi... Mais quand je vire le htaccess, la redirection ne marche plus et j'ai un joli erreur 404.

Car l'id du post (ici 4383) sort de nulle part, ainsi que d'autres paramètres.

4383 et l'id du post. C'est ce que je voulais avoir dans l'url de mes pages
Code:
/%category%/%postname%-%post_id%.html

J'ai vérifié les en-têtes http aussi. L'ancien url redirige vers une url intermédiaire qui redirige vers le bon url... C'est bizarre.
 
WRInaute discret
Sak a dit:
Je veux bien te croire, je t'assure. Je veux comprendre aussi... Mais quand je vire le htaccess, la redirection ne marche plus et j'ai un joli erreur 404.

Peux-tu afficher le contenu de ton htaccess actuellement?

En fait je suspecte fortement une redirection de toutes les urls vers l'index.php qui traite lui même la réécriture d'urls avec $_SERVER['REQUEST_URI'] (tout ceci en transparence framework).
Donc si tu changes la structure de tes urls, ton framework gère également les redirections.
Ce n'est qu'une hypothèse mais ça me semble plus logique qu'une redirection effective qui sort de nulle part.
 
WRInaute discret
voici le htaccess en question. C'est vraiment bizarre.

Code:
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

# Rediriger en 301 les anciens urls avec date vers les new avec categorie et post id...
RedirectMatch 301 ^/([0-9]{4})/([0-9]{2})/([0-9]{2})/([^/]+).html$ http://www.site.org/$1/$4-$2.html
#End...
Par contre quand j'ai enlevé cette redirection:
Code:
# Rediriger en 301 les anciens urls avec date vers les new avec categorie et post id...
RedirectMatch 301 ^/([0-9]{4})/([0-9]{2})/([0-9]{2})/([^/]+).html$ http://www.site.org/$1/$4-$2.html
#End...
l'url ne fait pas de redirection et produit du dupplicate content:
Code:
http://www.....org/2013/10/03/histoire-de-xory-xillage-xoninke-du-xiaxounou-partie-3.html

Par contre l'url intermédiaire généré par mon htaccess bizarre:
Code:
http://www.site.org/2013/histoire-de-xory-xillage-xoninke-du-xiaxounou-partie-3-10.html
Redirige directement vers la nouvelle structure cad
Code:
/%category%/%postname%-%post_id%.html
C'est comme s'il y a une boucle de redirection interne...

NB. je précise que j'utilise un système de cache WPSP
 
WRInaute discret
Code:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

Voilà qui confirme une partie de mon hypothèse. Toutes les urls (qui ne sont ni dossier, ni fichier physiquement existant) pointent sur l'index.php qui lui même va gérer le routage des urls.

En somme, la règle que tu as ajouté (RedirectMatch) ne doit servir à rien hormis mettre le désordre un peu plus.
N'oublie pas que ton navigateur a mis en cache la directive de redirection "fausse", ce qui peut t'empêcher de re-tester convenablement (sauf si tu t'en rends compte, c'est pour ça que je te le dis).

Donc pour résumer, je pense bien que wordpress gère pour toi les redirections quand tu changes le format d'une url.
 
WRInaute discret
Alors pourquoi quand j'enlève le htaccess, j'ai de jolies erreurs 404 ?
j'ai vidé le cache des navigateurs, pour préciser. Un coup il ne redirige pas l'ancien url sur le bon url /%category%/%postname%-%post_id%.html.
Quand je vide les caches et que je remette le htaccess bizarre, toutes les redirections fonctionnent.
 
WRInaute discret
Sak a dit:
Alors pourquoi quand j'enlève le htaccess, j'ai de jolies erreurs 404 ?

Car je n'ai jamais dit de supprimer le htaccess mais bien la ligne "RedirectMatch" uniquement.

Code:
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
 
WRInaute discret
Désolé, je n'ai pas été très précis quand je parlais de htaccess.
Je parlais de la ligne ci-dessous:
Code:
RedirectMatch 301 ^/([0-9]{4})/([0-9]{2})/([0-9]{2})/([^/]+).html$ http://www.site.org/$1/$4-$2.html
 
WRInaute discret
En fait ton RedirectMatch agit comme ceci:

Si j'accède à
http://www.soninkara.org/2013/10/03/histoire-de-gory-village-soninke-du-diafounou-partie-3.html
alors je suis redirigé vers
http://www.soninkara.org/2013/histoire-de-gory-village-soninke-du-diafounou-partie-3-10.html

Ce qui est logique par rapport à ta règle "RedirectMatch" mais pas par rapport à la logique globale. En effet, le "10" représente le mois et non l'ID.
Par contre, on dirait que wordpress gère en interne la redirection et qu'il reconnait l'url. Car au final on est bien redirigé vers
http://www.soninkara.org/histoire-soninke/histoire-de-gory/histoire-de-gory-village-soninke-du-diafounou-partie-3-4383.html

Honnêtement je sais pas. Pour le htaccess je dois juste te dire que ta règle n'est pas correcte logiquement parlant, même si cela donne un bon résultat. Je te conseille de regarder la documentation de wordpress au sujet des changements de format des urls et voir comment ils gèrent ça car c'est obligatoirement l'explication ici.
 
WRInaute discret
Giustino,
Merci pour toutes tes réponses. Je suis convaincu aussi que ma règle ne devrait pas marcher. Mais elle marche.
Je creuserai pour savoir par quelle mécanisme, wp redirige
http://www.soninkara.org/2013/histoire-de-gory-village-soninke-du-diafounou-partie-3-10.html
vers la bonne adresse.
L'énigme se situe sur cette dernière redirection.
 
Discussions similaires
Haut