web-dev-qa-db-fra.com

Activer Multiviews, c'est comment rendre un serveur Web capable d'ouvrir des liens avec des extensions manquantes?

Je suis en train de changer d'hôte Web. Mon ancien hôte était du genre "gants d'enfant", adapté aux débutants. J'avais moins de contrôle, mais cela réglait beaucoup de choses en coulisse.

Mon nouvel hébergeur me permettra de faire plus avec mon site, mais seul le strict minimum est mis en place. Le serveur Web ne fera rien de plus, à moins que je ne le lui dise expressément. Je dois maintenant apprendre un tas de nouvelles connaissances "évidentes" sur la gestion d'un serveur.

Lors du test de mon site sur le nouvel hôte, je me suis vite rendu compte que le serveur n'ouvrirait même pas les liens vers le site auxquels il manque une extension de fichier (par exemple, www.example.com/article99).

Newbie me cherche à comprendre comment configurer le serveur pour pouvoir y aller "Bon, ce lien vers /photo37 n'a pas d'extension, mais je vois qu'il y a un /photo37.png ici dans le répertoire. être ce à quoi le lien fait référence, alors je vais l'ouvrir ".

D'après ce que j'ai pu rechercher jusqu'à présent, la meilleure façon de faire est d'activer MultiViews. Quand j'ajoute Options +multiviews dans mon fichier .htaccess, cela semble faire l'affaire. Mais je veux vérifier que c’est la bonne façon de procéder et que quelque chose d’évident ne me manque pas. Toute aide ou des liens vers des ressources sont très appréciés.

2
Chris M

tl; dr Oui, vous pouvez activer MultiViews pour servir des URL sans extension. c'est à dire. L'extension de fichier est omise d'une URL qui autrement mapperait à un fichier existant. Cependant, soyez conscient des conflits potentiels avec mod_rewrite.

le serveur n'ouvrira même pas les liens vers le site auxquels il manque une extension de fichier

Vous donnez l'impression qu'il devrait s'agir d'un comportement normal (ou attendu)? Ce n'est pas. Sur la plupart des sites (base de données/CMS) de nos jours, ce comportement serait indésirable. MultiViews n'est pas activé par défaut sur Apache. Il doit être explicitement activé.

Comme vous l'avez constaté, certains hôtes partagés semblent activer automatiquement MultiViews pour ses clients. Ainsi, les URL sans extension fonctionnent "comme par magie". Cependant, si vous voulez ensuite faire quelque chose de plus complexe et réécrire/rediriger l'URL à l'aide de mod_rewrite, vous pouvez vous retrouver avec des conflits inattendus qui peuvent être déroutants pour le débogage. Cela semblerait être un problème assez courant - StackOverflow en particulier est jonché de questions de cette nature, où la solution consiste simplement à désactiver MultiViews (car cette fonctionnalité a été activée automatiquement par l'hôte).

Le conflit avec mod_rewrite provient du fait que mod_negotitation (qui entraîne MultiViews) s'exécute avant mod_rewrite. Par exemple, lorsque vous demandez /article99 avec MultiViews activé, mod_negotiation émet une sous-demande interne pour /article99.html (par exemple). Vous ne pouvez pas intercepter cela avec mod_rewrite, vous devrez faire une comparaison avec la sous-requête résultante, c'est-à-dire. /article99.html et non /article99 (ce à quoi vous vous attendiez puisqu'il s'agit de l'URL demandée par l'utilisateur et de la seule URL que vous voyez réellement).

Je veux vérifier que c'est la bonne façon de le faire

Eh bien, c'est une "façon de le faire". Oui, c'est "correct". Cependant, ce n'est pas la seule façon de le faire. Et ce n’est pas toujours la bonne façon de le faire. Cela dépend de ce que vous essayez de faire et de ce que vous faites déjà. Mais si cela fonctionne pour vous; utilise le.

MultiViews fait plus que simplement ajouter une extension de fichier. La ressource renvoyée dépend de la demande (il s’agit de la partie "négociation" de mod_negotiation). Et qui est retourné quand vous avez article99.php, article99.html et article99.jpg? Et si le seul fichier que vous avez est article99.abc, vous obtiendrez probablement un 404 (sauf si vous avez un gestionnaire défini pour les fichiers .abc).

Notez également que si vous utilisez simplement MultiViews, le fichier article99.html (par exemple) est également accessible. Vous avez donc les URL /article99 et /article99.html renvoyant la même ressource. Du point de vue technique, il s'agit d'un contenu en double, même si ce n'est pas nécessairement un problème si vous vous assurez que l'URL /article99 est la seule URL jamais référencée. Au minimum, vous devez définir un élément <link rel="canonical" pointant vers l'URL canonique, c'est-à-dire. /article99.

4
MrWhite