Apache RewriteRule – tout sauf localhost et loopback

J’ai un serveur sur lequel je souhaite appliquer la communication https depuis le monde extérieur. Cependant, il existe des services sur le serveur qui doivent être accessibles via http par processus sur le serveur local.

J’ai essayé ce qui suit:

RewriteEngine On RewriteCond %{HTTPS} off RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} 

Mais bien sûr, les services exécutés sur le serveur local ne sont pas accessibles via http. Comment puis-je appliquer https pour tout sauf localhost et 127.0.0.1? Ou, si cela est plus facile, j’ai deux domaines externes pour ce serveur: comment forcer uniquement https pour http: //sub1.domain1.suffix1 et http: //sub2.domain2.suffix2 et l’adresse IP externe du serveur?

Essayez ceci, je ne suis pas sûr que ça marchera, mais peut-être que je n’ai jamais traité la valeur réelle de ‘localhost’.

 RewriteEngine On RewriteCond %{HTTP_HOST} !^localhost [NC] RewriteCond %{REMOTE_ADDR} !^127\.0\.0\.1$ RewriteCond %{HTTPS} !=on RewriteRule ^/?(.*) https://mysub.mydomain.com/$1 [R=301,L] 

MISE À JOUR 2: J’y ai réfléchi et j’ai réalisé que cela ne permettait pas de gérer cette affaire: https://mysub2.mydomain.com/, redirect vers https://mysub.mydomain.com/ – avant d’append ceci, testez cette URL et voyez si il redirige avec la première règle ou non, si ce n’est pas le cas, teste plutôt ce second ensemble de règles.

Pour corriger ce cas, essayez:

 RewriteEngine On RewriteCond %{HTTP_HOST} !^localhost [NC] RewriteCond %{REMOTE_ADDR} !^127\.0\.0\.1$ RewriteCond %{HTTPS} !=on [OR] RewriteCond %{HTTP_HOST} mysub2.mydomain.com [NC] RewriteRule ^/?(.*) https://mysub.mydomain.com/$1 [R=301,L] 

UPDATE2 explication, si cela fonctionne:

Rendez le test plus compliqué, maintenant la réécriture se produit si ce n’est pas localhost / 127.0.0.1 puis testez pas https OU mysub2.mydomain.com /mysub.mydomain.com

= Explication UPDATE:

C’est un ensemble de règles assez simple. Nous créons 3 conditions à respecter pour que les règles de réécriture s’appliquent. Pour être sûr, j’utilise l’habitude ^, c’est-à-dire que c’est ce qui commence par, donc, le nom d’hôte / IP ne commence pas par localhost / 127.0.0.1. ! signifie non.

  1. Le nom d’hôte n’est pas localhost (nom d’hôte est ce que vous tapez dans votre navigateur pour accéder à la page, ou le nom que vous utiliseriez pour y accéder via votre service Web). Parce que les noms de domaine ne sont pas sensibles à la casse, j’ai ajouté le drapeau [NC], ce qui signifie No Case, c.-à-d. Insensibles à la casse. C’est celui dont je ne suis pas sûr qu’il fonctionnerait:

    RewriteCond% {HTTP_HOST}! ^ Localhost [NC]

  2. La requête distante IP n’est pas 127.0.0.1

    RewriteCond% {REMOTE_ADDR}! ^ 127.0.0.1 $

  3. https n’est pas déjà sur

    RewriteCond% {HTTPS}! = On

Ensuite, la règle de réécriture réelle, qui se déclenche si ces trois conditions sont remplies. Réécrivez toutes les URL qui ne comprennent pas le démarrage /, prenez tout dans cette URL (. *) Qui n’inclut pas le nom de domaine et ajoutez-le après https://mysub.mydomain.com/ , puis faites une redirection permanente 301 vers ce résultat complet. URL. ? signifie 0 ou 1. (. *) signifie: mettre tout après avoir démarré / ou pas commencé / dans $ 1, chaque (…) dans la règle est mis dans les variables $ 1, $ 2, etc.

RewriteRule ^ /? (. *) https://mysub.mydomain.com/ $ 1 [R = 301, L]

= FIN de la mise à jour

Votre configuration n’est pas totalement intuitive pour moi, mais en supposant qu’il y ait un seul domaine réel sur le serveur sur lequel vous voulez gérer les requêtes, je pense que cela fonctionnerait, pas positif, étant donné qu’il existe certaines fonctionnalités que je ne connais pas avec.

Pour redirect vers https, les trois conditions doivent être vraies, c’est-à-dire non locales / 127 et https non activées.

Essaye ça:

 RewriteEngine On RewriteCond %{HTTPS} off RewriteCond %{HTTP_HOST} !^localhost [NC] RewriteCond %{REMOTE_ADDR} !^127\.0\.0\.1$ RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]