web-dev-qa-db-fra.com

Passage du paramètre aux URL lisibles 301 redirection

J'ai récemment changé mes URL avec des paramètres pour des URL plus lisibles avec le texte suivant : htaccess :

RewriteRule ^page/([A-Za-z0-9-+_\s]+)$ /index.php?n=$1 [L]
RewriteRule ^category/([A-Za-z0-9-+_\s]+)/([0-9]+)$ /index.php?p=$1&b=$2 [L]

Je pense que cela pose maintenant des problèmes de duplication de contenu sur les moteurs de recherche, car index.php URL et domain.com/page/ URL seront tous deux indexés.

Si les appels passés à domain.com/page/1 sont redirigés vers index.php?n=1, comment puis-je rediriger les demandes effectuées vers index.php vers domain.com/page/?

Ma tentative en ce sens me donne un code 404 qui m'envoie à domain2.

#RewriteCond %{QUERY_STRING} ^n=([A-Za-z0-9]+)$ [NC]
#RewriteRule ^index\.php$ http://domain.com/page/? [R=301,L]


. htaccess:

IndexIgnore *
ErrorDocument 404 http://domain2.com


#REDIRECTS
Redirect 301 /keyword.php http://domain.com
Redirect 301 /inc/keyword.php http://domain.com




Options +FollowSymlinks
RewriteEngine on

#Redirect all pages in a folder to a single URL
RewriteRule ^test/(.*)$ http://domain.com [L,R=301]

# HTTP Host, escape . and start string with ^
RewriteCond %{HTTP_Host} ^www\.domain\.com [NC]
RewriteRule ^(.*)$ http://domain.com/$1 [R=301,NC] 


RewriteCond %{QUERY_STRING} ^p=h&m=([A-Za-z]+)&y=([0-9]+)$ [NC]
RewriteRule ^index\.php$ http://domain.com? [R=301,L]


#RewriteCond %{QUERY_STRING} ^n=([A-Za-z0-9]+)$ [NC]
#RewriteRule ^index\.php$ http://domain.com/page/? [R=301,L]


RewriteRule ^page/([A-Za-z0-9-+_\s]+)$ /index.php?n=$1 [L]

RewriteRule ^category/([A-Za-z0-9-+_\s]+)/([0-9]+)$ /index.php?p=$1&b=$2 [L]
2
rrrfusco

Vous avez raison de penser au contenu dupliqué lorsque vous modifiez une structure d'URL et que les anciennes URL sont déjà indexées.

# My attempt to do so is giving me a 404 code sending me to domain2.
#RewriteCond %{QUERY_STRING} ^n=([A-Za-z0-9]+)$ [NC]
#RewriteRule ^index\.php$ http://domain.com/page/? [R=301,L]

Dans ce cas, http://domain.com/page/ semblerait être une URL non valide, mais vous supprimez également les informations contenues dans la chaîne de requête et ne les transmettez pas à l'URL "conviviale" (toutes les URL sont donc redirigées de la même manière). URL invalide).

Vous devez également faire attention aux boucles de redirection, car vous réécrivez en interne une URL contenant la chaîne de requête (pour que votre URL conviviale fonctionne), mais vous devez également rediriger les URL contenant la chaîne de requête pour éviter le contenu en double.

Nous pouvons contourner la boucle de redirection en vérifiant que %{THE_REQUEST} contient la requête HTTP complète telle qu'elle a été envoyée par le client et ne changera pas après une réécriture.

Donc, pour votre première "page" URL:

RewriteCond %{THE_REQUEST} \?n=([A-Za-z0-9]+)$
RewriteRule ^index\.php$ /page/%1? [R=301,L]

Notez que le modèle [A-Za-z0-9] (tiré de votre exemple) dans l'URL est plus restrictif que le modèle dans vos réécritures [A-Za-z0-9-+_\s] (qui autorise les espaces!?) - les deux modèles doivent être identiques et ne pas autoriser. les espaces. (Notez que THE_REQUEST contient des espaces, la regex devra changer si vous en avez vraiment besoin.)

EDIT: Compte tenu de la mise à jour ci-dessous (pour autoriser deux paramètres), j’ajoute un $ (marqueur de position) dans la directive RewriteCond ci-dessus pour indiquer la fin du chaîne. Ceci maintenant seulement autorise un paramètre d'URL.

Et les redirections externes devraient venir avant les réécritures internes (ce que vous semblez avoir fait de toute façon).

PDATE: Pour un deuxième paramètre (comme indiqué dans les commentaires), ajoutez ces directives supplémentaires:

RewriteCond %{THE_REQUEST} \?n=([A-Za-z0-9]+)&y=([A-Za-z0-9]+)$
RewriteRule ^index\.php$ /page/%1/%2? [R=301,L]

Ceci vérifie exactement deux paramètres (n et y dans cet ordre) et redirige en conséquence.

(Notez l'édition de la première règle ci-dessus pour un paramètre.)

1
MrWhite

Pouvez-vous utiliser un proxy devant votre Apache? Quelque chose comme Varnish peut faire la réécriture pour vous, et lorsque vous séparez les préoccupations, vous réduisez le risque de créer des boucles de redirection et autres. Et cela accélérera votre site web ...

Si vous ne pouvez pas exécuter de proxy sur votre serveur, vous pouvez peut-être envisager d'utiliser des services externes plutôt que de le faire pour vous, entre autres choses. Le service que je fais fonctionne, et je pense le fait bien. Voir l'URL dans mon profil.

0
mathieubolla