8721 sujets

Développement web côté serveur, CMS

Bonjour,
Mon générateur de sites web construit automatiquement un fichier .htaccess comportant une redirection depuis la forme www vers le nom de domaine du site en cours de construction.
Me basant sur la documentation et les différents articles publiés sur le net, la section rewrite est générée comme indiqué ci-dessous (la séquence <domaine> ne sert ici que pour l'exemple, le générateur utilisant celui du site cible) :
<IfModule mod_rewrite.c>
  # URL de base du site web
  RewriteBase /
  # Redirection vers HTTPS
  RewriteCond %{HTTPS} !=on
  RewriteRule ^  https://<domaine>%{REQUEST_URI}  [R=301,L]
  # Redirection www vers site standard
  RewriteCond %{HTTP_HOST} ^<domaine>$
  RewriteRule ^  https://<domaine>%{REQUEST_URI}  [R=301,L]
  # Redirection ressource non trouvée
  RewriteCond %{SCRIPT_FILENAME} !-f
  RewriteCond %{SCRIPT_FILENAME} !-d
  RewriteRule ^  https://<domaine>/pages/erreur-404.php  [R=301,L]
</IfModule>

L'instruction RewriteEngine on est quant à elle définie par ailleurs dans le fichier et tout fonctionne correctement une fois déployé chez l'hébergeur.
Cela étant, je développe dans le même temps un programme en Java devant me permettre d'auditer un site web complet (sécurité / conformité / performance + SEO à venir) et j'ai donc mis en place quatre instructions de test pour vérifier l'accès sans URI :
http://<domaine>/
 https://<domaine>/
 
 http://www.<domaine>/
 
 https://www.<domaine>/

Comme prévu, chacune de ces URL m'amène bien in fine sur la page d'accueil du site, soit directement (code 200) soit via une redirection (code 301).
La sortie console du programme Java me donne ceci :
Connected to URL [http://<domaine>/] with status value [301]
-> Redirected to [https://<domaine>/]
Connected to URL [http://www.<domaine>/] with status value [301]
-> Redirected to [https://<domaine>/]
Connected to URL [https://<domaine>/] with status value [200]
Connected to URL [https://www.<domaine>/] with status value [200]

La présence de deux codes retour 200 ne me semble pas normale et susceptible d'entraîner du contenu dupliqué, or les instructions du fichier .htaccess devraient justement rediriger (donc avec code 301) la version avec https et www vers le nom de domaine natif. Seule l'URL https://<domaine>/ devrait, à mon avis, produire un code 200.
N'étant pas un spécialiste des fichiers .htaccess et après avoir fait quelques recherches complémentaires, quelqu'un sur le forum aurait-il une idée sur l'erreur commise dans les instructions ci-dessus ?
Merci d'avance pour les retours d'information.
Modérateur
Bonjour,

Alors il y a deux règles:
1) qui redirige le http:// vers https://domaine
2) qui redirige les requêtes qui commencent par domaine vers https://domaine (et qui ne fait donc rien)

Quelques remarques:

- Un redirect 301 vers une 404 c'est pas terrible, enlever le R=301
- Pourquoi forcer à enlever le www? Si l'utilisateur veut faire le contraire? ou aucun redirect?
- Le redirect HTTPS ou enlever/ajouter un www ne requiert pas le nom de domaine

Voici le htaccess de HTML boilerplate pour un exemple de comment configurer cela proprement et bien documenté: https://github.com/h5bp/html5-boilerplate/blob/master/dist/.htaccess
kustolovic a écrit :
Bonjour,
Alors il y a deux règles:
1) qui redirige le http:// vers https://domaine
2) qui redirige les requêtes qui commencent par domaine vers https://domaine (et qui ne fait donc rien)
Quelques remarques:
- Un redirect 301 vers une 404 c'est pas terrible, enlever le R=301
- Pourquoi forcer à enlever le www? Si l'utilisateur veut faire le contraire? ou aucun redirect?
- Le redirect HTTPS ou enlever/ajouter un www ne requiert pas le nom de domaine
Voici le htaccess de HTML boilerplate pour un exemple de comment configurer cela proprement et bien documenté: https://github.com/h5bp/html5-boilerplate/blob/master/dist/.htaccess

Hello kustolovic... merci de t'y être collé. Smiley cligne
Concernant la redirection 301 vers une 404 c'est corrigé au niveau du générateur.
Pour ce qui est d'enlever le www c'est tout simplement parce que la majorité des articles et tutoriels lus sur le net préconisent cette forme de redirection en prenant comme argument le fait qu'elle entraîne un contenu dupliqué (elle figure d'ailleurs dans le github auquel tu fais référence).
Cela laisse de toute façon le choix à l'utilisateur d'entrer l'URL du site sous la forme qu'il souhaite, avec ou sans www, puisque in fine il aboutira sur la même page.
Comme indiqué dans le message initial, cette redirection générée par le logiciel au niveau du .htaccess fonctionne sans problème et tout est transparent pour le visiteur du site.
Idem pour la redirection HTTP vers HTTPS fonctionne également.
Par contre, j'ai toujours deux URL qui retournent un code 200 :
a) https://<domaine>
b) https://www.<domaine>
alors que logiquement je devrais avoir une 301 de la version b vers la version a.
J'ai trouvé un contournement en redirigeant le www vers la version http ce qui redirige ensuite vers la version https, mais franchement dans le genre lourdingue on fait difficilement mieux et je ne souhaite pas retenir cette solution.
Mon problème demeure donc entier et je souhaite encore n'avoir qu'une version retournant un 200.
Le prototype du portail dédié au générateur présente ce double code 200 selon la forme entrée dans la barre d'adresse du navigateur.
Avoir constaté qu'il y avait plusieurs codes 200 expliquerait par ailleurs pourquoi un outil de test de performance en ligne me retournait une erreur pour risque de "duplicated content" (sans que le bougre m'indique pour autant sur quel argument il se basait...).
Modérateur
Je connais bien le problème du duplicated content, ma question n'était pas pourquoi le faire, mais pourquoi le forcer dans un sens uniquement. On peut forcer le www, forcer le sans www pour diverses raisons. Mettons de côté le cas (rare aujourd'hui) ou on a un site différent sur www que sans.

concernant le problème je n'ai pas été clair sans doute. Cette règle:

# Redirection www vers site standard
RewriteCond %{HTTP_HOST} ^<domaine>$
RewriteRule ^   https://<domaine>%{REQUEST_URI}   [R=301,L]

Redirige les requêtes qui commencent par domaine (^), donc qui ne commence pas par www vers la version sans www. De plus, le domaine n'a pas à être indiqué, cela surcomplexifie la problématique inutilement. Encore une fois, la manière propre est indiquée dans le htaccess que j'ai mis en lien.

Sinon je ne pense même pas que ce soit très pertinent. Ce genre de réglage se passent aujourd'hui au niveau de l'hébergement pour un hébergement mutualisé, qui gère proprement ces redirections dans leur proxy. Sur un serveur dédié, ce genre de chose n'a rien à faire dans le htaccess de toutes façon et sera configuré soit dans un proxy, soit dans un vhost.
kustolovic a écrit :
Je connais bien le problème du duplicated content, ma question n'était pas pourquoi le faire, mais pourquoi le forcer dans un sens uniquement. On peut forcer le www, forcer le sans www pour diverses raisons. Mettons de côté le cas (rare aujourd'hui) ou on a un site différent sur www que sans.
concernant le problème je n'ai pas été clair sans doute. Cette règle:

# Redirection www vers site standard
RewriteCond %{HTTP_HOST} ^&lt;domaine&gt;$
RewriteRule ^   https://&lt;domaine&gt;%{REQUEST_URI}   [R=301,L]

Redirige les requêtes qui commencent par domaine (^), donc qui ne commence pas par www vers la version sans www. De plus, le domaine n'a pas à être indiqué, cela surcomplexifie la problématique inutilement. Encore une fois, la manière propre est indiquée dans le htaccess que j'ai mis en lien.
Sinon je ne pense même pas que ce soit très pertinent. Ce genre de réglage se passent aujourd'hui au niveau de l'hébergement pour un hébergement mutualisé, qui gère proprement ces redirections dans leur proxy. Sur un serveur dédié, ce genre de chose n'a rien à faire dans le htaccess de toutes façon et sera configuré soit dans un proxy, soit dans un vhost.

Au temps pour moi, erreur de rédaction initiale du sujet...
La redirection de www est effectivement erronée dans mon texte initial (utilisation non contrôlée de la touche effacement arrière Smiley cligne ) et c'est la forme ci-dessous qui est effectivement produite par mon générateur :

# Redirection www vers site standard
RewriteCond %{HTTP_HOST} ^www.<domaine>$
RewriteRule ^   https://<domaine>%{REQUEST_URI}   [R=301,L]

Le domaine est indiqué puisque le générateur le connaît et je veux expressément rediriger cette URL.
Côté pertinence de la présence dans le .htaccess, du moment que je n'ai aucun accès à la configuration de l'hébergement mutualisé, au proxy ou à un quelconque vhost, elle me paraît évidente et, de toute façon, les redirections http vers https et www.<domaine> vers <domaine> fonctionnent conformément à ce qui est attendu au niveau du navigateur.
Reste donc qu'en toute logique je ne devrais n'avoir qu'un code 200 et trois codes 301 retourné sur les 4 formes d'URL possibles.
Je réfléchis actuellement à la possibilité de supprimer tout simplement ces redirections du fichier .htaccess et de les traiter directement depuis le script PHP généré. Cela aurait au moins l'avantage de la simplicité et d'une totale portabilité, que le serveur utilise une configuration .htaccess, nginx ou autre.