J'ai un serveur Web Apache2 (version 2.2.16) s'exécutant sur Debian hébergeant trois hôtes virtuels. Les deux premiers hôtes sont uniquement HTTP (server1 et server2). Le dernier hôte est uniquement HTTPS (server3). Les fichiers de configuration de mon hôte virtuel sont disponibles sur Pastebin . Je voudrais utiliser mod rewrite pour obtenir le comportement suivant:
http://server3
est redirigée vers https://server3
https://server1
ou https://server2
est redirigée vers http://server1
ou http://server2
selon le cas.Actuellement, demander http://server3
vous donne 403 car l'indexation est désactivée pour cet hôte et une demande pour https://server1
ou https://server2
sera résolue en tant que https://server3
(car c'est le seul hôte virtuel en cours d'exécution SSL). Ce comportement n'est pas souhaitable.
Jusqu'ici, j'ai ajouté une règle de réécriture au fichier de configuration central ( myServerWideConfs.conf ), avec malheureusement aucun effet. J'avais l'impression que cette règle (ou quelque chose de similaire) devrait réécrire toutes les demandes https: // pour server1 et server2 dans la requête http: // appropriée.
RewriteEngine On
RewriteCond %{HTTP_Host} !^server3 [NC]
RewriteRule (.*) http://%{HTTP_Host}
Ma question est double:
Ce que je fais: utiliser vhosts pour chaque site, y compris un vhost pour la variante à supprimer. Cela conserve toute la configuration d'un site nommé en un seul endroit. La duplication de contenu est minimale grâce à mod_macro
.
Vous voulez émettre une redirection, pas une réécriture en interne, car l’idée est d’obtenir le client pour réessayer en utilisant le protocole correct. Assurez-vous de ne réécrire que pour GET, car une redirection après POST signifie que les données sont acceptées et que vous souhaitez uniquement traiter les personnes utilisant un schéma incorrect dans leur navigateur Web. Les utilisateurs d'API doivent utiliser le code correct. interface.
Alors:
<IfModule mod_rewrite.c>
<VirtualHost 192.0.2.1:80 [2001:db8::1234:1]:80>
ServerName www.example.org
DocumentRoot /www/sites/empty-stub
RewriteEngine on
RewriteCond %{REQUEST_METHOD} =GET
RewriteRule ^(.*) https://www.example.org$1 [R,L]
</VirtualHost>
</IfModule>
et si vous le faites souvent, enveloppez-le dans un bloc mod_macro <Macro>..</Macro>
afin qu'il devienne:
Use RedirToHTTPS www.example.org
C'est délicat. Historiquement, cela n’était pas possible puisque SSL n’autorisait pas d’indiquer à quel hôte virtuel il tentait d’accéder car il établissait la connexion avec l’adresse IP désignée. Cela a quelque peu changé avec Indication du nom du serveur ( RFC 4366 ), une fonctionnalité de TLS.
Apache a mis beaucoup de temps à obtenir de l’aide, mais c’est maintenant le cas . Votre version est suffisamment nouvelle pour pouvoir la prendre en charge, mais vous aurez besoin d'un navigateur qui le fera également. Avant de travailler sur le processus de réécriture, je commencerais par vérifier que https://server1.example.com/
renvoie le bon VHost. Une fois que cela aura été fait, le travail de réécriture de mod devrait fonctionner.