2

我只需要从 request.servervariables("HTTP_HOST") 中提取域的第二级部分,最好的方法是什么?

4

4 回答 4

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

适用于我需要的东西,但它不处理 .co.uk 或其他具有顶级预期的两个部分的域。

于 2008-10-13T05:00:05.100 回答
1

这可以通过正则表达式来解决。

由于HTTP_HOST服务器变量只能包含有效的主机名,我们不需要关心验证字符串,只需要找出它的结构。因此,正则表达式保持相当简单,但在更广泛的上下文中无法可靠地工作。

该结构3.2.1分别用于第三、第二和第一级(顶级)域。

顶级域可以有 2 个以上的字母(如.com.de),或者从概念上讲是一个组合,如.co.uk. 从技术上讲,这不再是 TLD,但我认为您对获得co许多英国主机名的二级域并不真正感兴趣。

所以我们有

  • 可选:各种事物开头(子域),一个点=^(.*?)\.?
  • 必填:中间一块(二级域),一个点=(\w+)\.
  • 要求:末尾有一个短位(或两个短位)=(\w{2,}(?:\.\w{2})?)$

这三件事将被记录在第 1、2 和 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
于 2008-10-13T07:17:33.263 回答
0

刚刚检查了我租用的服务器空间的子域的差异,http_host 和 server_name 都报告了包括子域在内的域名。

于 2009-10-15T10:13:29.163 回答
-1

由于 HTTP_HOST 标头仅返回域(不包括任何子域),您应该能够执行以下操作:

'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"
于 2008-10-16T01:48:50.023 回答