Besoin de rediriger tout le trafic vers https
Je veux rediriger tout le trafic qui va à http://example.com à https://example.com
De Même pour http://example.com/about à https://example.com/about
Je pensais que ce serait quelque chose comme ceci:
RewriteCond %{HTTP_HOST} ^example.com$ [NC]
RewriteRule ^(.*)$ https://example.com/$1 [R=301,L]
5 réponses
Cela fonctionne pour moi:
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
Si le trafic arrive sur HTTP non-SSL, redirigez-vous vers L'équivalent HTTP de la page à laquelle l'utilisateur essayait d'accéder à l'origine. Il n'implique pas non plus d'options mod_rewrite, il est donc facile à lire.
Diatribe latérale: pourquoi tout le monde ressent-il le besoin de définir explicitement le code HTTP de la redirection et de marquer l'une de leurs réécritures comme la "dernière"? Sérieusement, j'ai vu des dizaines de règles htaccess de même apparence dans les derniers jour.
Ceci est une réponse précédente utilisant .htttaccess mais en ajoutant des changements proposés dans les commentaires, et certains de moi:
RewriteEngine on
RewriteBase /
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://my.domain.name%{REQUEST_URI} [L,R=301]
Notes:
- C'est pour le cas où l'utilisateur n'a pas accès à la configuration principale, mais a accès .les règles htaccess. Si vous avez accès à la configuration principale, utilisez la solution mod_alias à la place .
- pour moi, la règle n'a pas été reprise sans définir RewriteBase. Définir explicitement il se débarrasse de l'ambiguïté avec certains les configurations de serveurs.
- , Au moins sur certaines configurations,
%{HTTPS}
n'est pas définie suroff
lors de l'utilisation de http, mais est null,!on
est plus fiable de la règle deoff
. - pour le nom d'hôte explicite, vous ne comptez pas sur l'en-tête D'hôte côté client ou la configuration du serveur. Cependant, le nom d'hôte explicite suppose naturellement qu'il n'y a qu'un seul domaine à rediriger. Host header pose des problèmes considérables, tels que contenir le port et être des données fournies par le client. Une autre alternative, comme suggéré par Apache Wiki , est d'utiliser
%{SERVER_NAME}
. Si vous envisagez de l'utiliser, consultez la mise en garde de cette discussion - elle repose sur une autre configuration correcte. -
R=301
signifie que c'est une redirection permanente, comme c'est généralement censé l'être dans ce cas. Si vous pensez plutôt que c'est temporaire, cela peut être omis ou spécifié commeR=302
. -
L
signifie que c'est la dernière règle à être appliquée pour cette requête. Laissez le si vous soupçonnez Ou savez qu'il y a d'autres règles Après cela que vous ne voulez pas obtenir appliquer. Vous pouvez supprimer si c'est la seule règle du fichier.
Selon la documentation Apache , l'utilisation de mod_alias
est plus appropriée que mod_rewrite
pour cette tâche. C'est-à-dire, afin de rediriger tout le trafic HTTP vers HTTPS, on pourrait:
<VirtualHost *:80>
ServerName www.example.com
Redirect permanent / https://www.example.com/
</VirtualHost >
<VirtualHost *:443>
ServerName www.example.com
# ... SSL configuration goes here
</VirtualHost >
Deux choses à noter sur cette configuration:
- Vous devez accéder au fichier de configuration du serveur principal pour que cette configuration fonctionne. La directive
VirtualHost
n'est valide que dans le contexte" configuration du serveur". - gardez à l'esprit que les directives
mod_rewrite
sont traitées avantmod_alias
directives. Si vous avez déjà un bloc massif deRewriteRule
s dans votre fichier.htaccess
, vous pourriez être mieux avec la configurationmod_rewrite
.
Pourquoi pas tout simplement?
rewriteCond %{HTTPS} !on
rewriteRule ^(.*)$ https://%{SERVER_NAME}%{REQUEST_URI} [R,L]
Cela a fonctionné pour moi, et me semble clair. Acclamation.
Après quelques recherches, ce qui a fonctionné pour moi, une version un peu différente.
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]