2017-09-01 2 views
1

Je travaille actuellement sur une application conçue pour fonctionner avec des sous-domaines génériques.Apache Redirect Sous-domaine Wildcard du sous-domaine

Par exemple:

  • customer1.domain.com

  • customer2.domain.com

Nous avons donc acheté un certificat SSL pour wildcard * .domaine.com et redirigé tous les sous-domaines de http à https. Jusqu'à présent, si facile, mais maintenant, nous avons des clients qui tapent manuellement www.customer1.domain.com dans leur navigateur, pour cela n'existe pas vhost.

Ce que je veux faire maintenant, rediriger toutes les demandes http://www.wildcard.domain.com-https://wildcard.domain.com

Notre vhost ressemble:

<VirtualHost {{IP-ADRR}}:443> 
    Servername %1.domain.com 
    VirtualDocumentRoot /path/to/webroot/%0 
    Include /etc/httpd/conf/options-ssl-standard.conf 
</VirtualHost> 

Notre Redirect pour toute demande HTTP à même cible sur HTTPS ressemble:

<Virtualhost {{IP-ADRR}}:80> 
    ServerName %1.domain.com 
    RewriteEngine On 
    RewriteCond %{HTTPS} !=on 
    RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L] 
</VirtualHost> 
+0

Que faire si l'utilisateur accède à http ** s **: //www.wildcard.domain.com? Votre solution ci-dessous fonctionne-t-elle? –

Répondre

1

la solution pour la redirection est:

<Virtualhost {{IP-ADRR}}:80> 
    ServerName %1.domain.com 
    RewriteEngine On 
    RewriteCond %{HTTPS} off [OR] 
    RewriteCond %{HTTP_HOST} ^www\. [NC] 
    RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC] 
    RewriteRule^https://%1%{REQUEST_URI} [L,NE,R=301] 
</VirtualHost> 

Explication:

RewriteCond %{HTTPS} off [OR] 
RewriteCond %{HTTP_HOST} !^www\. [NC] 

Ces deux lignes sont sont les conditions de redirection, ils sont utilisés pour déterminer si devrait être réorienté la demande. Comme les conditions sont jointes avec un [OR], si l'une de ces deux conditions renvoie true, Apache exécutera la règle de réécriture (la redirection).

La première condition détermine si la demande utilise une URL non HTTPS. La deuxième condition détermine si la requête utilise l'URL www. Notez que j'ai utilisé www \. et non www., parce que le motif est une expression régulière et le. point a une signification particulière ici, d'où il doit être échappé.

RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC] 

La quatrième ligne est une ligne pratique que j'ai utilisée pour éviter de référencer le nom d'hôte directement dans l'URL. Il correspond à l'HÔTE de la requête entrante, et le décompose en www part (le cas échéant), et le reste du nom d'hôte. Nous le référencerons plus tard avec% 1 dans RewriteRule.

RewriteRule^https://www.%1%{REQUEST_URI} [L,NE,R=301] 

La RewriteRule est le cœur de la redirection. Avec cette ligne, nous demandons à Apache de rediriger toute demande vers une nouvelle URL, composée de:

  • https://www.
  • % 1: la référence à la partie non www de l'hôte
  • % {REQUEST_URI}: l'URI de la demande, sans le nom d'hôte

Tous ces jetons sont reliés entre eux, et représente la URL de redirection finale.Enfin, nous ajoutons 3 drapeaux:

  • NE de ne pas échapper à des caractères spéciaux
  • R = 301 à utiliser l'état de redirection HTTP 301
  • L pour arrêter le traitement d'autres règles, et rediriger immédiatement