web-dev-qa-db-fra.com

Rediriger depuis une URL avec des paramètres vers une URL conviviale pour le référencement dans .htaccess

J'ai la page de catégorie avec cette structure

example.com/Category.php?Category_Id=10&Category_Title=some-text

je veux écrire des règles htaccess pour rediriger de

example.com/Category.php?Category_Id=10&Category_Title=some-text

pour ça

example.com/Category/10/some-text

y at-il un moyen de forcer htaccess à le faire. je veux quand je visite le

example.com/Category.php?Category_Id=10&Category_Title=some-text

la page Catégorie redirige automatiquement vers

example.com/Category/10/some-text

j'utilise ce code htaccess mais il ne redirige pas la page vers une URL conviviale

Options -Multiviews
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_Host} !^exmaple\.com$
RewriteRule ^(.*) http://exmaple.com/$1 [R=301,L]

comment puis-je le faire?

5
Mohammadreza

tl; dr

# Redirect /Category.php?Category_Id=10&Category_Title=some-text
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{QUERY_STRING} ^Category_Id=(\d+)&Category_Title=([\w-]+)$
RewriteRule ^Category\.php$ /Category/%1/%2? [R=301,L]

j'ai changé le lien généré de mauvaise structure de référencement à une structure conviviale de référencement et cela fonctionne

Très bien, je suis content que vous ayez réglé le problème, je suppose que vous utilisez une sorte de CMS? (Cela a probablement ajouté quelque chose à votre .htaccess je pense?)

Quoi qu'il en soit, pour répondre à votre (vos) première (s) question (s) ...

Me: avez-vous déjà changé l'URL de votre application au format "joli"? par exemple. L'URL que l'utilisateur voit sur la page est example.com/Category/10/some-text, pas example.com/Category.php?Category_Id=10&Category_Title=some-‌text?

Vous: oui .mais c'est beaucoup. Il faut que toutes les URL soient jolies dans toutes les pages et je le fais maintenant.mais je veux savoir s'il existe une solution htaccess je le fais.so vous dites que changer d'URL dans toutes les pages est la seule solution ...

Bien qu'il soit techniquement possible de l'implémenter uniquement dans .htaccess, sans modifier réellement les URL de votre application, cela n'est pas recommandé. Cela créerait une mauvaise expérience utilisateur et pourrait potentiellement endommager le référencement de votre site.

Si vous ne modifiez pas l'URL dans votre application, chaque fois qu'un utilisateur clique sur un lien interne, il subit une redirection externe (une deuxième demande) vers l'URL canonique (jusqu'à ce que la redirection soit mise en cache). C'est une requête supplémentaire (inutile) sur votre serveur. L'ancienne URL serait exposée à l'utilisateur et copiable (par exemple, "Copier l'adresse du lien").

Habituellement, la seule raison d'implémenter une telle redirection est que si les anciennes URL avaient déjà été liées et/ou si les moteurs de recherche avaient déjà indexé l'ancienne structure d'URL. La redirection est alors nécessaire pour préserver le référencement.

Réécriture interne (nouvelle "jolie" URL vers l'ancienne URL "laide")

Afin de mettre en place une structure d'URL conviviale comme celle-ci, vous aurez besoin d'une réécriture interne qui réécrit la demande en silence de la nouvelle "jolie" URL vers l'ancienne ("vraie" URL). L'utilisateur ne voit que la nouvelle "jolie" URL. Votre question suppose que vous avez déjà eu quelque chose comme ça (peut-être pas)? Par exemple:

# Rewrite /Category/10/some-text
RewriteRule ^Category/(\d+)/([\w-]+)$ Category.php?Category_Id=$1&Category_Title=$2 [L]

$1 et $2 sont des références arrières aux groupes capturés dans la RewriteRulemodèle. c'est à dire. \d+ et [\w-]+ respectivement.

Si c'était un nouveau site, vous pourriez vous arrêter là, cependant ...

Redirection externe (ancienne URL "laide" vers une nouvelle "jolie" URL) - facultatif

Cette redirection devrait aller avant ​​la réécriture ci-dessus dans votre fichier .htaccess:

# Redirect /Category.php?Category_Id=10&Category_Title=some-text
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{QUERY_STRING} ^Category_Id=(\d+)&Category_Title=([\w-]+)$
RewriteRule ^Category\.php$ /Category/%1/%2? [R=301,L]

Afin de vérifier la partie chaîne de requête de l'URL, vous devez utiliser une directive RewriteCond et la comparer à la variable de serveur QUERY_STRING (la RewriteRulemodèle ne correspond qu'à la partie URL-path de l'URL).

%1 et %2 sont des références arrières aux groupes capturés lors de la dernière correspondance CondPattern. c'est à dire. \d+ et [\w-]+ respectivement. C'est l'inverse de la réécriture précédente.

Le ? à la fin de la RewriteRulesubstitution est requis pour supprimer la chaîne de requête de la demande. (Vous pouvez également utiliser le drapeau QSD sur Apache 2.4+)

PDATE: La condition vérifiant la variable d'environnement REDIRECT_STATUS garantit que nous ne redirigeons que la demande initiale et non la demande réécrite par la directive ultérieure (voir ci-dessus). . La variable REDIRECT_STATUS env n'existe pas (c'est-à-dire qu'elle est vide) lors de la demande initiale et n'est définie qu'après la première réécriture/sous-demande interne. (Dans un contexte par répertoire (comme .htaccess), le processus de réécriture reprend essentiellement après le dernier RewriteRule et continue ainsi jusqu'à ce que l'URL soit inchangée. Le drapeau L provoque simplement la fin du "passage actuel" du processus de réécriture, ce qui entraîne le redémarrage effectif du processus, en utilisant l’URL maintenant réécrite comme entrée.)

Résumé

En réunissant cela, nous avons:

Options -Multiviews
RewriteEngine On

# Canonical www to non-www redirect
RewriteCond %{HTTP_Host} !^example\.com
RewriteRule (.*) http://exmaple.com/$1 [R=301,L]

# Redirect /Category.php?Category_Id=10&Category_Title=some-text
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{QUERY_STRING} ^Category_Id=(\d+)&Category_Title=([\w-]+)$
RewriteRule ^Category\.php$ /Category/%1/%2? [R=301,L]

# Rewrite /Category/10/some-text
RewriteRule ^Category/(\d+)/([\w-]+)$ Category.php?Category_Id=$1&Category_Title=$2 [L]

Les vues multiples doivent être désactivées (si ce n'est déjà fait) pour que cet exemple fonctionne.

4
MrWhite