web-dev-qa-db-fra.com

Redirige HTTP vers HTTPS sur l'hôte virtuel par défaut sans nom_serveur

Sur mon serveur Apache, j'aimerais pouvoir rediriger toutes les demandes http entrantes vers la demande https équivalente. Le problème est que j'aimerais pouvoir effectuer cette opération pour mon hôte virtuel par défaut sans spécifier le paramètre ServerName et que la redirection fonctionne avec le nom du serveur figurant dans l'URL de la demande. J'espère quelque chose comme ça:

NameVirtualHost *:80
<VirtualHost *:80>
    RedirectPermanent / https://%{SERVER_NAME}/
    ...
</VirtualHost>

Est-ce possible d'utiliser Redirect ou devrais-je recourir à Rewrite?

66
highlycaffeinated

Essayez d’ajouter ceci dans votre configuration vhost:

RewriteEngine On
RewriteRule ^(.*)$ https://%{HTTP_Host}$1 [R=301,L]
97
Jon Lin

Les deux fonctionnent bien. Mais selon le Apache docs , vous devriez éviter d'utiliser mod_rewrite pour les redirections simples, et utilisez plutôt Redirect . Donc, selon eux, vous devriez faire de préférence:

<VirtualHost *:80>
    ServerName www.example.com
    Redirect / https://www.example.com/
</VirtualHost>

<VirtualHost *:443>
    ServerName www.example.com
    # ... SSL configuration goes here
</VirtualHost>

La première / après Redirect est l'URL, la deuxième partie est l'endroit où il devrait être redirigé.

Vous pouvez également l'utiliser pour rediriger des URL vers un sous-domaine: Redirect /one/ http://one.example.com/

82
orszaczky

C’est aussi le moyen idéal d’omettre les redirections inutiles;)

Ces règles sont destinées à être utilisées dans les fichiers .htaccess, comme une RewriteRule dans une entrée *: 80 VirtualHost ne nécessite aucune condition.

RewriteEngine on
RewriteCond %{HTTPS} off [OR] 
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^/(.*) https://%{HTTP_Host}/$1 [NC,R=301,L]

Eplanations:

RewriteEngine on

==> activer le moteur du tout

RewriteCond %{HTTPS} off [OR]

==> correspondance sur les connexions non-https, ou (ne pas définir [OR] provoquerait un ET implicite!)

RewriteCond %{HTTP:X-Forwarded-Proto} !https

==> correspondance sur les connexions transférées (proxy, loadbalancer, etc.) sans https

RewriteRule ^/(.*) https://%{HTTP_Host}/$1 [NC,R=301,L]

==> si l'une des deux conditions correspond, effectuez la réécriture de l'URL complète en envoyant un message 301 pour que le client "l'apprenne" (certains le font, d'autres pas) et le L pour la dernière règle.

35
Jimmy Koerting