web-dev-qa-db-fra.com

Mod_rewrite - redirige le trafic HTTP / HTTPS vers les hôtes virtuels appropriés

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:

  • Toute demande de http://server3 est redirigée vers https://server3
  • Toute demande de 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:

  • Quelles règles de réécriture de mod devrais-je utiliser pour accomplir cela? Et où devraient-ils aller? L’emballage d’Apache par Debian a une jolie structure de fichier de configuration granulaire (c’est-à-dire fracturée); mes règles de réécriture doivent-elles aller dans /etc/Apache2/Apache2.conf , /etc/Apache2/conf.d /myServerWideConfs.conf, ou les fichiers de l'hôte virtuel individuel?
  • Le mod réécrit-il le bon outil pour accomplir ceci ou est-ce que quelque chose me manque dans ma plus grande configuration Apache?
2
user5596

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
4
Phil P

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.

0
sysadmin1138