2008-10-13 9 views

Répondre

1

Cela peut être résolu par une expression régulière. Comme la variable de serveur HTTP_HOST ne peut contenir que des noms d'hôte valides, nous n'avons pas besoin de nous préoccuper de pour valider la chaîne, mais seulement pour connaître sa structure. Par conséquent, la regex est assez simple, mais ne fonctionnerait pas de manière fiable dans des contextes plus larges.

Et la structure est 3.2.1 pour les domaines de troisième, deuxième et premier niveau (de premier niveau), respectivement.

Un domaine de premier niveau peut avoir 2+ lettres (comme .com ou .de) ou, conceptuellement, une combinaison, comme .co.uk. Ce n'est pas techniquement un TLD plus, mais je suppose que vous n'êtes pas vraiment intéressé à obtenir co comme domaine de deuxième niveau pour de nombreux noms d'hôtes britanniques.

Nous avons donc

  • en option: toutes sortes de choses au début (sous-domaine), un point = ^(.*?)\.?
  • nécessaire: une pièce au milieu (deuxième niveau domaine), un dot = (\w+)\.
  • requise: un court bit (ou deux bits courts) à la fin = (\w{2,}(?:\.\w{2})?)$

Ces trois éléments seront capturés dans les groupes 1, 2 et 3.

Dim re, matches, match 

Set re = New RegExp 

re.Pattern = "^(.*?)\.?(\w+)\.(\w{2,}(?:\.\w{2})?)$" 

Set matches = re.Execute(Request.ServerVariables("HTTP_HOST")) 

If matches.Count = 1 Then 
    Set match = matches(0) 

    ' assuming "images.res.somedomain.co.uk" 
    Response.Write match.SubMatches(0) & "<br>" ' will be "images.res" 
    Response.Write match.SubMatches(1) & "<br>" ' will be "somedomain" 
    Response.Write match.SubMatches(2) & "<br>" ' will be "co.uk" 

    ' assuming "somedomain.com" 
    Response.Write match.SubMatches(0) & "<br>" ' will be "" 
    Response.Write match.SubMatches(1) & "<br>" ' will be "somedomain" 
    Response.Write match.SubMatches(2) & "<br>" ' will be "com" 
Else 
    ' You have an IP address in HTTP_HOST 
End If 
+0

L'en-tête HTPT_HOST n'est pas censé inclure les sous-domaines. Ça n'a pas de sens. Pour analyser le sous-domaine, il doit utiliser l'en-tête SERVER_NAME. Compte tenu de l'URL: http://cdn.domain.co.uk, HTTP_HOST devrait renvoyer "domain.co.uk", tandis que SERVER_NAME devrait renvoyer "cdn.domain.co.uk" – defeated

+0

Bien sûr HTTP_HOST contient des sous-domaines . Allez le chercher. – Tomalak

+0

comme ça? http://www.google.com/search?q=http_host+vs+server_name – defeated

1
If Len(strHostDomain) > 0 Then  
    aryDomain = Split(strHostDomain,".") 

    If uBound(aryDomain) >= 1 Then 
     str2ndLevel = aryDomain(uBound(aryDomain)-1) 
     strTopLevel = aryDomain(uBound(aryDomain))   
     strDomainOnly = str2ndLevel & "." & strTopLevel 
    End If 
End If 

fonctionne pour ce dont j'ai besoin, mais il ne gère pas .co.uk ou d'autres domaines qui ont deux parties attendues pour le niveau supérieur.

-1

Since HTTP_HOST renvoie uniquement le domaine (à l'exclusion des sous-domaines), vous devriez être en mesure de faire ce qui suit:

'example: sample.com 
'example: sample.co.uk 
host = split(request.serverVariables("HTTP_HOST"), ".") 
host(0) = "" 'clear the "sample" part 

extension = join(host, ".") 'put it back together, ".com" or ".co.uk" 
+0

Cela n'a aucun sens. Je ne pense pas que vous ayez compris la question. – Tomalak

0

Juste vérifié la différence sur un sous-domaine de mon ServerSpace loué et les deux http_host et nom_serveur a renvoyé le nom de domaine, y compris le sous-domaine.