request.servervariables( "HTTP_HOST")からドメインの第2レベルの部分のみを抽出する必要があります。これを行うための最良の方法は何ですか?
4 に答える
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 や、トップ レベルに 2 つの部分が期待される他のドメインは処理しません。
これは正規表現で解決できます。
サーバー変数には有効なホスト名のみを含めることができるため、文字列の検証HTTP_HOST
については気にする必要はなく、その構造を見つけることだけを気にする必要があります。したがって、正規表現はかなり単純に保たれていますが、より広いコンテキストでは確実に機能しません。
また、構造は3.2.1
それぞれ、第 3 レベル、第 2 レベル、および第 1 レベル (トップレベル) ドメイン用です。
トップレベル ドメインには 2 文字以上 (.com
または など.de
)、または概念的には のような組み合わせを含めることができます.co.uk
。これは技術的co
にはもはや TLD ではありませんが、多くの英国のホスト名の第 2 レベル ドメインとして取得することにあまり関心がないように思われます。
だから私たちは持っています
- オプション: 開始時のあらゆる種類のもの (サブドメイン)、ドット =
^(.*?)\.?
- 必須: 真ん中の部分 (第 2 レベル ドメイン)、ドット =
(\w+)\.
- 必須: 最後の短いビット (または 2 つの短いビット) =
(\w{2,}(?:\.\w{2})?)$
これら 3 つのことは、グループ 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
レンタルしたサーバースペースからサブドメインの違いを確認したところ、http_host と server_name の両方がサブドメインを含むドメイン名を報告しました。
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"