web-dev-qa-db-fra.com

Force https: // et www. avec l'hôte virtuel Apache2

Je cherchais partout une solution permettant de forcer https: // www devant toutes mes URL à l'aide de l'hôte virtuel. Voici ce que j'ai actuellement dans mon fichier 000-default.conf:

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

Cela signifie que tous les www. serait rediriger vers https: // www.

Maintenant, il me manque le code pour rediriger toutes/toutes les autres formes d'URL vers https: // www . en utilisant le même concept (pas RewriteEngine car Apache suggère de ne pas utiliser RewriteEngine sur des redirections simples).

Par exemple:

  • http: //domain.com
  • http: //www.domain.com
  • https: //domain.com

ils iraient tous à => https://www.domain.com

Si quelqu'un peut me diriger dans la bonne direction, ce serait génial!

5
Edward

Cela a fonctionné pour moi, vous pouvez le tester sur mon domaine si vous le souhaitez.

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

<VirtualHost *:443>
    ServerName freesoftwareservers.com
    ServerAlias *.freesoftwareservers.com

http://domain.com

http://www.domain.com

https://domain.com

J'ai eu des problèmes pour ré-implémenter cela, et j'ai constaté que si je supprimais le lien symbolique 000-default.conf de/sites-enabled, cela fonctionnait. Je ne suis pas certain de l’affaire, mais j’ai 0 autres enregistrements DNS du côté DNS et mon Apache effectue toutes les redirections et cela fonctionne.

11
FreeSoftwareServers

Vous avez besoin de trois redirections pour faire ce que vous voulez:

http://example.com à https://www.example.com

http://www.example.com à https://www.example.com

https://example.com à https://www.example.com

Les deux premiers sont du port 80 en clair, donc vous avez un VirtualHost pour eux. Vous pouvez faire en sorte qu'une section VirtualHost s'applique à plusieurs noms d'hôte (www.example.com et example.com) en créant une section ServerAlias:

# Redirect http://example.com and http://www.example.com to main site
<VirtualHost *:80>
  ServerName www.example.com
  ServerAlias example.com

  Redirect / https://www.example.com/
</VirtualHost >

Ensuite, vous avez besoin d'un VirtualHost pour votre https://example.com seulement. HTTPS utilise le port 443:

# Redirect https://example.com to main site
<VirtualHost *:443>
  ServerName example.com

  Redirect / https://www.example.com/
</VirtualHost >

Remarque: vous devrez également y configurer vos paramètres SSL, avec un certificat prenant en charge le domaine avec et sans le "www.". La configuration de vos paramètres SSL n’entre pas dans le cadre de cette question. ( Ajout d'informations: il peut s'agir de deux certificats distincts si vous le souhaitez; il est de plus en plus courant de disposer de nombreux certificats séparés. Nous avons maintenant des éléments tels que Let's Encrypt et SNI )

Si vous ne possédez pas de certificat SSL prenant en charge votre domaine sans le "www." Dans ce cas, vous ne pourrez pas faire la redirection à partir de https://example.com. La redirection n'aura lieu que lorsque le navigateur aura vérifié le certificat. L'utilisateur serait présenté avec une erreur de certificat incompatible.

Enfin, vous avez besoin de votre section VirtualHost pour le site "valide": HTTPS (port 443) sur www.example.com:

# Main site
<VirtualHost *:443>
  ServerName www.example.com

  # Put all your configuration for this site here

</VirtualHost >

Une fois que vous avez testé vos redirections et que vous êtes satisfait de leur fonctionnement, vous pouvez les rendre permanentes en spécifiant le statut 301 dans la redirection (remplacez Redirect / https://www.example.com/ par Redirect 301 / https://www.example.com/ partout) et en activant HSTS qui oblige les navigateurs des utilisateurs à se souvenir de leur préférence pour HTTPS.

3
thomasrutter

Pour ajouter à la réponse de thomasrutter, j'avais toujours un problème quand je faisais ce qu'il suggérait. Parfois, vous devrez peut-être ajouter les informations SSL à l'hôte virtuel https://example.com . Par exemple, lorsque vous utilisez SNI pour autoriser plusieurs certificats SSL par adresse IP.

Sans cela, vous risquez d'obtenir l'erreur ssl_error_rx_record_too_long, car le serveur retournera du texte brut à la requête https.

# Redirect https://example.com to main site
<VirtualHost *:443>
  ServerName example.com
  Redirect / https://www.example.com/

  #for Apache Old Style (Valid on Apache <= 2.4.8) - just add in whats needed for your version
  SSLEngine on
  SSLCertificateFile        "your certificate file.crt"
  SSLCertificateKeyFile     "your key file.key"
  SSLCertificateChainFile   "your chain file.crt"
</VirtualHost >
1
funferret.com