web-dev-qa-db-fra.com

RedirectMatch et Redirect interférant les uns avec les autres

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
  • Il existe un composant de blog WordPress sur le site (sous /blog) ainsi que des pages d'adhésion et de profil construites en dehors de WordPress.
  • La première ligne est un moyen plus simple d’accéder à un ensemble spécifique de blogs dans une sous-catégorie, c.-à-d. 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)
  • La deuxième ligne traduit sitename/username en 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.

2
E.Hoh

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.

0
MrWhite