J'ai les lignes suivantes dans mon .htaccess
(il y a d'autres lignes mais ces deux sont côte à côte)
RedirectMatch 301 ^/datingstories https://example.com/blog/category/relationships/datingstories/
RewriteRule ^([a-zA-Z0-9_-]+)$ showprofile.php?username=$1
/blog
) ainsi que des pages d'adhésion et de profil construites en dehors de WordPress.https://example.com/datingstories
se traduit par la sous-catégorie de rencontres du blog. Ceci est également partagé en externe (c'est pourquoi je voulais l'URL plus courte)sitename/showprofile.php?username=username
. Il y a des pages de profil de membre sur le site et l'URL est simplifiée (c'est-à-dire que https://example.com/frank
redirige vers https://example.com/showprofile.php?username=frank
). Cependant, l'URL du navigateur indique https://example.com/frank
Le problème est que lorsque https://example.com/datingstories
est cliqué/lié à, l'URL résultante est https://example.com/blog/category/relationships/datingstories/?username=dating
Pendant le chargement de la page, existe-t-il un moyen d'empêcher le ?username=dating
de s'afficher dans l'URL résultante? Je pense que la deuxième règle .htaccess
est appliquée, mais je ne suis pas sûr de savoir comment, puisque showprofile.php
ne s'affiche pas dans l'URL résultante.
En outre, idéalement, il serait intéressant que la page résultante affiche l'URL la plus courte au lieu de la plus longue.
J'apprécie votre temps à regarder et à répondre à cela.
RedirectMatch et Redirect interférant les uns avec les autres
Dans l'exemple que vous avez donné, RedirectMatch
(mod_alias) et RewriteRule
(mod_rewrite) "interfèrent les uns avec les autres", pas Redirect
. Redirect
est une directive mod_alias, qui fonctionne avec RedirectMatch
- donc vous ne vous attendriez pas nécessairement à ce que ceux-ci entrent en conflit de cette manière.
Comme mentionné ci-dessus, RewriteRule
est une directive mod_rewrite, alors que RedirectMatch
(et Redirect
) sont des directives mod_alias. Différents modules Apache s'exécutent indépendamment et à différents moments de la requête, quel que soit l'ordre apparent dans votre fichier .htaccess
. Dans le cas de mod_alias et de mod_rewrite, mod_rewrite exécute toujours en premier .
Ainsi, dans votre exemple, la RewriteRule
(2ème directive) sera traitée avant la directive RedirectMatch
qui la précède - puisqu'elles correspondent toutes les deux à l'URL /datingstories
. Le traitement se poursuit ensuite dans le fichier et tout le processus recommence pour une seconde passe, lorsque le premier mod_alias RedirectMatch
redirect l'URL (RedirectMatch
correspond à l'URL de la demande, pas à l'URL réécrite. Donc, cela correspond à nouveau à /datingstories
, pas showprofile.php
- l’URL réécrite). Ceci remplace le chemin URL réécrit (showprofile.php
) mais conserve la chaîne de requête (?username=dating
). (Cependant, les directives que vous avez publiées ne précisent pas pourquoi datingstories
serait tronqué en dating
dans le paramètre URL - peut-être qu'il y a un conflit avec d'autres directives.) L'ancien rewrite est converti en une redirection externe après l’application du statut HTTP 301.
La leçon à tirer est qu’il ne faut jamais mélanger redirections/réécritures à partir des deux modules - afin d’éviter des conflits tels que celui-ci. Puisque WordPress utilise mod_rewrite pour son contrôleur frontal, vous devriez idéalement utiliser mod_rewrite. Par conséquent, vous devez convertir les directives mod_alias RedirectMatch
(et Redirect
) pour qu'elles utilisent mod_rewrite RewriteRule
à la place.
Par exemple:
RewriteRule ^datingstories /blog/category/relationships/datingstories/ [R=301,L]
RewriteRule ^([a-zA-Z0-9_-]+)$ showprofile.php?username=$1 [L]
Et ne négligez pas l'indicateur L
- pour arrêter le traitement ultérieur (passage actuel du fichier) si nécessaire.