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?
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
, pasexample.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.
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 RewriteRule
modèle. c'est à dire. \d+
et [\w-]+
respectivement.
Si c'était un nouveau site, vous pourriez vous arrêter là, cependant ...
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 RewriteRule
modè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 RewriteRule
substitution 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.)
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.