Faire des redirections (WWW et S dans HTTP) via le htaccess

Nouveau WRInaute
Bonjour,

j'ai un site qui a plus de 10 ans et qui existait notamment quand il n'y avait de certificat SSL.

Je cherche à faire des redirections 301 avec le htaccess et surtout d'éviter de faire 2 redirections à la suite.

Voici les URLs que je souhaite rediriger :
http://www.monsite.com/page1.php > https://www.monsite.com/page1.php
http://monsite.com/page1.php > https://www.monsite.com/page1.php
https://monsite.com/page1.php > https://www.monsite.com/page1.php

Des redirections comme ça j'en ai plus d'une centaine.

Est-ce que quelqu'un connait une règle générale pour faire ces redirections pour toutes les URLs d'un coup ?
Donc dire :
1/ si il n'y a pas de S dans le HTTP mais qu'il y a bien le sous domaine WWW, alors redirige vers le même fichier mais en ajoutant un S dans le HTTP et en ajoutant le sous domaine WWW.
2/ si il a un S dans le HTTP, mais qu'il n'y a pas le sous domaine WWW, alors redirige vers le même fichier en ajoutant le sous domaine WWW (et en conservant le S dans le HTTP bien sûr)
3/ si il n'y a pas un S dans le HTTP, et qu'il a le sous domaine WWW, alors redirige vers le même fichier mais avec le S dans le HTTP (et en conservant le sous domaine WWW).

En fait ce que je souhaite éviter c'est qu'une URL sans S dans le HTTP : http://monsite.com/page1.php soit dans un premier temps rediriger vers https://monsite.com/page1.php puis dans un 2ème temps redirigée vers https://www.monsite.com/page1.php

Merci beaucoup pour votre aide :)
Bon week-end
 
WRInaute passionné
Il faut 2 règles mais ça ne fera pas pour autant de double redirection donc il n'y a pas de problème.

Code:
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.monsite.com/$1 [R=301,L]

RewriteCond %{HTTP_HOST} !=www.monsite.com
RewriteRule ^(.*) https://www.monsite.com/$1 [QSA,L,R=301]
 
Nouveau WRInaute
Bonjour Rick,
merci pour ton aide.
J'ai c/c ton code dans mon htaccess (en modifiant le nom de domaine bien sûr) mais la j'ai une boucle de 301 et mon browser (Firefox) me dit "La page n’est pas redirigée correctement".
J'ai vérifié via https://www.redirect-checker.org/index.php et je peux voir plus d'une vingtaine de "301 Moved Permanently" à la suite.

Voici les seules lignes qu'il y a dans mon htaccess:
Code:
RewriteEngine On

RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.monsite.fr/$1 [R=301,L]

RewriteCond %{HTTP_HOST} !=monsite.fr
RewriteRule ^(.*) https://www.monsite.fr/$1 [QSA,L,R=301]
 
WRInaute occasionnel
Bonjour,
Qu'en est-il avec ce code ? :

RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]

RewriteCond %{HTTPS} !^on$
RewriteRule (.*) https://%{HTTP_HOST}/$1 [R,L]

Ou même plus simple :

RewriteCond %{HTTP_HOST} !^www\. [OR]
RewriteCond %{HTTPS} off
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
 
Dernière édition:
Nouveau WRInaute
rick38 vient d'éditer son message. Merci Rick, maintenant ça fonctionne avec ce code dans mon htaccess :

Code:
RewriteEngine On

RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.monsite.fr/$1 [R=301,L]

RewriteCond %{HTTP_HOST} !=www.monsite.fr
RewriteRule ^(.*) https://www.monsite.fr/$1 [QSA,L,R=301]

Par contre, ça ne marche plus avec le code par défaut dans mon Wordpress donc quand j'ai ce htaccess :

Code:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.monsite.fr/$1 [R=301,L]

RewriteCond %{HTTP_HOST} !=www.monsite.fr
RewriteRule ^(.*) https://www.monsite.fr/$1 [QSA,L,R=301]

Redirect 301 /page-old-school.php https://www.monsite.fr/nouvelle-page1.php
Redirect 301 /page-old-school2.php https://www.monsite.fr/nouvelle-page2.php
Redirect 301 /page-old-school3.php https://www.monsite.fr/nouvelle-page3.php
Redirect 301 /page-old-school4.php https://www.monsite.fr/nouvelle-page4.php

Quand je dis que ça ne marche pas, c'est que je tape l'URL https://monsite.fr/une-page.php et que ça ne me redirige pas automatiquement sur https://www.monsite.fr/une-page.php
 
WRInaute impliqué
Je cherche à faire des redirections 301 avec le htaccess et surtout d'éviter de faire 2 redirections à la suite.

https://www.webrankinfo.com/dossiers/techniques/redirection-http-https

Il faut 2 règles mais ça ne fera pas pour autant de double redirection donc il n'y a pas de problème.
L'essentiel est en effet d'éviter de rediriger vers une page qui redirige, écueil qui est évité par ton code, donc pas de soucis.

Après, pour la beauté du geste, ça peut se faire en une seule règle. Pas de gain, sinon une éventuelle facilité pour recycler le code d'un site à l'autre. Pour reprendre le code dans la page cité ci-dessus :

Apache config:
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
RewriteRule ^.*$ https://www.%1%{REQUEST_URI} [L,NE,R=301]

Par contre, ça ne marche plus avec le code par défaut dans mon Wordpress donc quand j'ai ce htaccess :
Faudrait voir comment le bloc ajouté par Wordpress interfère, peut-être qu'il effectue une redirection et met un terme à l'examen des rewriterule, mais ça ne devrait pas si ton URL correspond à des noms de fichier sur le serveur…

Tu pourrais tenter de mettre les règles de redirection avant le bloc de WP, mais c'est peut être problématique, la consigne RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] devant en principe précéder toutes autres.
 
Nouveau WRInaute
Merci :D ! EDIT: ceci était une fausse joie ^^.
Tout fonctionne à merveille et sans double redirection.

J'ai testé ta technique Emu donc j'ai avec ce code no souci :
Code:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.monsite.fr/$1 [R=301,L]

RewriteCond %{HTTP_HOST} !=www.monsite.fr
RewriteRule ^(.*) https://www.monsite.fr/$1 [QSA,L,R=301]

RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
 
Dernière édition:
Nouveau WRInaute
Non, raté, fausse joie...

Pour les anciennes redirection (les URLs de mon site qui ont 7 ou 8 ans) j'ai une double redirection.


Pour l'URL : http://www.monsite.fr/page-old-school.php
Ca redirige dans un premier temps vers : https://www.monsite.fr/page-old-school.php (avec le S dans http)
Puis enfin vers la bonne page : https://www.monsite.fr/nouvelle-page.php

Mon code est le suivant :

Code:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.monsite.fr/$1 [R=301,L]

RewriteCond %{HTTP_HOST} !=www.monsite.fr
RewriteRule ^(.*) https://www.monsite.fr/$1 [QSA,L,R=301]

RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

Redirect 301 /page-old-school.php https://www.monsite.fr/nouvelle-page.php

Sauriez-vous comment je peux faire pour éviter cette double redirection SVP ?
 
WRInaute impliqué
Il faudrait traiter le particulier avant le général.

Mais c'est pas toujours une bonne idée, ça peut perturber le reste, surtout si y'a beaucoup de règles particulières.
 
WRInaute occasionnel
Avez-vous essayé le code que je vous ai proposé pour voir ?
Vous pourrez comparer le résultat des 2 codes proposés.
 
Nouveau WRInaute
Hello @pomination,

Avec ça j'ai des 404 quand je vais voir mes pages (j'ai un Wordpress) :
Code:
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\. [OR]
RewriteCond %{HTTPS} off
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]


Et même chose avec ce code. J'ai une 404 au lieu d'afficher une page existante.
Code:
RewriteEngine On


RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]

RewriteCond %{HTTPS} !^on$
RewriteRule (.*) https://%{HTTP_HOST}/$1 [R,L]

@emualliug, même en mettant les règles spécifiques avant, j'ai le même problème. Cad une ancienne page http://www.monsite.fr/ancienne-page.php redirige dans un premier temps vers https://www.monsite.fr/ancienne-page.php et enfin la bonne page : https://www.monsite.fr/nouvelle-page-2024.php :'(
 
WRInaute impliqué
Je ne vois pas comment. La directive Redirect redirige vers l'URL désignée et les autres règles ne sont pas examinées.

Si l'URL est juste modifiée avec l'ajout de HTTPS, c'est qu'il l'est pas une autre directive (ou autrement) examinée avant.

Faudrait copier / coller tout le htaccess, et donner l'URL du site, pour mieux comprendre.
 
Nouveau WRInaute
La directive Redirect redirige vers l'URL désignée et les autres règles ne sont pas examinées.

Ok je donne ici tous mon htaccess mais sans mon ndd :

Code:
# BEGIN WordPress
# Les directives (lignes) entre « BEGIN WordPress » et « END WordPress » sont générées
# dynamiquement, et doivent être modifiées uniquement via les filtres WordPress.
# Toute modification des directives situées entre ces marqueurs sera surchargée.
<IfModule mod_rewrite.c>
RewriteEngine On

Redirect 301 /ancienne-page.php https://www.monsite.fr/
Redirect 301 /ancienne-page2.php https://www.monsite.fr/nouvelle-page.php
Redirect 301 /ancienne-page3.php https://www.monsite.fr/
Redirect 301 /ancienne-page4.php https://www.monsite.fr/
Redirect 301 /ancienne-page5.php https://www.monsite.fr/nouvelle-page.php
Redirect 301 /ancienne-page6.php https://www.monsite.fr/nouvelle-page2.php
Redirect 301 /ancienne-page7.php https://www.monsite.fr/nouvelle-page.php
Redirect 301 /ancienne-page8.php https://www.monsite.fr/nouvelle-page.php

RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.monsite.fr/$1 [R=301,L]

RewriteCond %{HTTP_HOST} !=www.monsite.fr
RewriteRule ^(.*) https://www.monsite.fr/$1 [QSA,L,R=301]

RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress



deny from 1.0.0.0/24
deny from 1.0.1.0/24
deny from 1.0.2.0/23
deny from 1.0.4.0/22
...

Donc c'est parfait pour toutes les pages actuelles, cad :
http://monsite.fr redirige bien directement vers https://www.monsite.fr
https://monsite.fr redirige bien directement vers https://www.monsite.fr
http://www.monsite.fr redirige bien directement vers https://www.monsite.fr

Cependant il y a un problème pour les anciennes pages redirigées, cad :
http://monsite.fr/ancienne-page.php redirige vers https://www.monsite.fr/ancienne-page.php puis https://www.monsite.fr/nouvelle-page.php
http://www.monsite.fr/ancienne-page.php redirige vers https://www.monsite.fr/ancienne-page.php puis https://www.monsite.fr/nouvelle-page.php
Et par contre, si on tape directement avec le S de HTTP + le sous domaine WWW on a bien une seule redirection cad :
https://www.monsite.fr/ancienne-page.php redirige directement vers https://www.monsite.fr/nouvelle-page.php
 
WRInaute impliqué
Un détail, mais qui ne devrait pas être la cause du problème, ne pas "bidouiller" directement dans le htaccess entre les lignes # BEGIN WordPress et # END WordPress, comme indiqué, elles sont susceptibles d'être écrasées par WP.

Avec ce code, http://monsite.fr/ancienne-page2.php devrait bien renvoyer vers https://www.monsite.fr/nouvelle-page.php dès le premier passage

Es-tu certain que le cache du navigateur est désactivé (certains navigateurs gardent en mémoire les 301) ? Que dit un outil comme https://www.redirect-checker.org/index.php ?
 
WRInaute impliqué
C'est tout de même étrange. N'y a-t-il pas d'autres paramétrages qui ferait la redirection en amont du .htaccess ? Que se passe-t-il si tu le désactive quelques secondes le temps de faire un test ?
 
Discussions similaires
Haut