web-dev-qa-db-fra.com

Problème avec la redirection 301 vers la page d'index uniquement

J'ai un tas de 301 redirections dans mon .htaccess pour les anciennes pages, qui fonctionnent très bien.

Mais un problème qui me tourmente depuis des années est qu'il y a beaucoup de liens vers ma vieille page d'index (index.html). Je veux les rediriger vers le nouveau index.php, afin de sauvegarder le lien, etc. (si c'est toujours comme ça que ça fonctionne?)

Le problème est que, si je fais une redirection de index.html vers index.php cela fonctionne très bien pour mon site principal ... mais cela affecte également le d'autres sites Web (URL distinctes) exécutés à partir de sous-dossiers sur le même serveur. Les pages d'index de tous les autres sites Web sont également redirigées vers le site principal.

Comment puis-je écrire une redirection qui affecte uniquement la page d'index du domaine principal, sans affecter les autres sites? Ma première idée évidente était d'utiliser deux URL absolues, mais apparemment, c'est non?

3
ola.rogula

En supposant que vos "autres sites Web" utilisent différents domaines/hôtes, vous pouvez vérifier le HTTP_Host avant de le rediriger. Identique à la redirection canonique www.

Cependant, cela nécessite l'utilisation de mod_rewrite. En supposant que example.com soit votre domaine principal, vous pouvez alors effectuer les opérations suivantes:

RewriteEngine On
RewriteCond %{HTTP_Host} ^(www\.)?example\.com [NC]
RewriteRule ^index\.html$ / [R=301,L]

Cela signifie que ... pour toutes les demandes qui correspondent à /index.html et le hôte correspond à example.com (ou www.example.com), puis la redirection 301 vers example.com/ (ou www.example.com/).

Notez que ceci redirige simplement vers / et permet à mod_dir d'extraire le nécessaire DirectoryIndex (c'est-à-dire index.php). Si vous voulez vraiment être explicite et rediriger vers index.php (non recommandé, sauf si c'est ce que vous êtes en train de faire), incluez l'intégralité de substitution/index.php.

Le (www\.)? (rendant www optionnel) serait inutile si vous avez une redirection canonique en place.

Si vous utilisez actuellement Redirect (ou RedirectMatch), faisant partie de mod_alias, vous devriez idéalement les convertir également en mod_rewrite. Sinon, faites attention à tout conflit. mod_alias sera exécuté après mod_rewrite, malgré l'ordre apparent des directives dans .htaccess.

Ma première idée évidente était d'utiliser deux URL absolues, mais apparemment, c'est non?

Ce n'est qu'un "non-non" dans la mesure où les directives Apache pertinentes ne vous permettent pas de spécifier une URL absolue en tant que source. Ils s'attendent à un chemin URL uniquement. La partie hôte de l'URL source est séparée. Cependant, une URL absolue cible (ou substitution dans la terminologie mod_rewrite) convient parfaitement.

... d'autres sites Web (URL distinctes) exécutés à partir de sous-dossiers

L'exécution de sites Web distincts dans sous-répertoires du domaine principal n'est pas idéale, à moins qu'ils ne soient étroitement liés. Comme les fichiers .htaccess sont hérités le long du chemin du système de fichiers, vous pouvez avoir des conflits.

0
MrWhite