Glengamoi (Forum) · AspHeute · .NET Heute (RSS-Suche) · AspxFiles (Wiki) · .NET Blogs

Eine IP Adresse für mehrere Websites

Geschrieben von: Christoph Wille
Kategorie: Server

This printed page brought to you by AlphaSierraPapa

IP Adressen sind - zumindest für IPv4 - eine zur Neige gehende Resource. Dadurch ist man auch am Webserver manchmal gezwungen, mehrere Websites über eine einzige IP Adresse zu bedienen. Ein anderer Grund für mehrere Websites per IP Adresse wäre, daß man einen Account bei einem ISP mit mehreren Sites besser auslasten möchte.

Egal was die Motivation ist, das Problem muß gelöst werden. Dank IIS und ASP hat man aber 2 unterschiedliche Möglichkeiten, das Problem zu lösen, obwohl beide auf der gleichen Technik aufsetzen: den Host Header abzufragen.

Was ist der Host Header? Das ist das, was der Benutzer in der Adressbox des Browsers eintippt, allerdings nur der Teil, der den Server identifiziert. Für die Adresse

http://www.alphasierrapapa.com/componentcenter/default.asp

ist der Host Header

www.alphasierrapapa.com

Da dieser Host Header mit jedem Request mitgeschickt wird (bei allen modernen Browsern inklusive Netscape), kann man mehrere Websites auf einer IP Adresse fahren. IIS unterstützt das Trennen von IIS Websites bereits "out of the box" als Standardfeature, allerdings kann man auch ASP verwenden, um Websites selbst anhand des Host Headers zu identifizieren. Beide Methoden werden in diesem Artikel vorgestellt, zuerst schauen wir uns aber das Testszenario an.

Das Testszenario

Üblicherweise werden Websites verschiedener Domains auf eine IP Adresse gemappt (zB www.aspgerman.com und www.alphasierrapapa.com), um allerdings das Beispiel im kleinen Rahmen durchtesten zu können reicht es bereits, zusätzliche Hosts mit derselben IP Adresse in die Forward Lookup Zone der eigenen DNS Zone einzutragen.

Wer Windows 2000 mit Active Directory einsetzt, der hat automatisch einen DNS Server mit einer Zone für die Domain und kann sehr leicht neue Hosts eintragen. Ich habe die Hosts hostheader1 und hostheader2 für meine AD Domain hinzugefügt.

Mehrere IIS Websites auf einer IP Adresse

Die erste Variante mehrere Websites auf einer IP Adresse zu fahren ist es mehrere IIS Websites im IIS anzulegen. Der Vorteil ist, man muß nichts programmieren. Der Nachteil: wenn man einen Account bei einem Provider gemietet hat, dann bedeutet das einen weiteren Account pro Website. Diese Technik wird man also meist dann anwenden, wenn man selbst die Kontrolle über den Webserver hat.

Und wie funktioniert das in der Praxis? Sehr einfach. Zuerst legt man die erste IIS Website, die auf dieser einen IP Adresse liegen soll, einfach an. Bei der zweiten und jeder folgenden muß man im dritten Schritt neben der IP Adresse auch den Host Header eingeben (in Falle dieses Beispiels ist dies hostheader2.dev.alfasierrapapa.com):

Der Rest (Pfad zur Website und Zugriffsberechtigungen können wieder nach Belieben eingeben werden.

Wenn man später den Host Header ändern will, dann muß man die Eigenschaften der IIS Website aufrufen, und im Web Site Tab auf die Schaltfläche Advanced klicken. In der Dialogbox Advanced Multiple Web Site Configuration kann man - so man möchte - auch mehrere Host Header auf diese eine IIS Website binden.

Zum Beweis daß es funktioniert braucht man nur den Browser öffnen und den URL der gewünschten "gehostheaderten" Website eingeben:

Ein weiterer Vorteil dieser Variante ist, daß man wirklich getrennte IIS Websites für jede Website hat. Dies bedeutet einfachere Administration, und bessere Trennung der verschiedenen ASP Applikationen. Aber wie gesagt, um diese Technik umzusetzen muß man den Server unter der eigenen Kontrolle haben.

Mehrere Websites auf einer IIS Website

Auch wenn man keine direkte Kontrolle über den Webserver und das Anlegen von Websites hat, ist noch lange nicht alles verloren - man kann mit ASP den Host Header genauso abfragen! Einzig und allein die Hauptseite (meist /default.asp) muß modifiziert werden, und ich präsentiere hier 2 Ansätze.

Client-side Redirects

Die erste Variante zur Programmierung ist die des client-seitigen Redirects basierend auf dem Wert des Host Headers SERVER_NAME.

<% @ Language=VBScript %>
<%
Response.Buffer = True
Response.Expires = 0
Response.AddHeader "Pragma","no-cache"
Response.AddHeader "cache-control", "no-store"

strDomainName = Request.ServerVariables("SERVER_NAME")
strDomainName = LCase(strDomainName)

If (0 = StrComp("hostheader1.dev.alfasierrapapa.com",strDomainName)) Then
   Response.Redirect "hostheader1.asp"
   Response.End
End If

' alles, was nicht abgefangen wird, landet auf hostheader2.asp
Response.Redirect "hostheader2.asp"
Response.End
%>

Der Sourcecode ist nicht weiter aufwendig: SERVER_NAME wird ausgelesen, auf Kleinbuchstaben umgewandelt, und dann in einem (oder mehreren) if Statements gegen vordefinierte Host Header verglichen. Basierend auf den Vergleichen wird auf die jeweiligen Startseiten redirected (Achtung: Response.Redirect schickt die Redirect Anweisung an den Client)

Die Zuweisung von SERVER_NAME auf eine lokale Variable hat einen guten Grund: jeder Lookup in einer Collection (ServerVariables ist ja eine) kostet Zeit, der Zugriff auf eine lokale Variable hingegen ist deutlich schneller. Und da möglicherweise sehr oft verglichen wird, kann sich das bei dieser sehr kurzen ASP Seite prozentuell auf die Laufzeit des Scripts sehr stark auswirken. Deshalb sollte auch der Vergleich für die am öftesten aufgerufene Website immer am Anfang der Vergleiche stehen.

Server-side Includes

Die zweite Variante arbeitet ohne Redirects - sie inkludiert die jeweiligen Dateien direkt am Server. Der Vorteil dieser Variante ist, daß kein client-seitiger Redirect ausgelöst wird, und man das Faktum, daß mehrere Websites von einer IIS Website aus bedient werden besser kaschieren kann.

<% @ Language=VBScript ENABLESESSIONSTATE=FALSE%>
<%
Response.Buffer = True
Response.Expires = 0
Response.AddHeader "Pragma","no-cache"
Response.AddHeader "cache-control", "no-store"

strDomainName = Request.ServerVariables("SERVER_NAME")
strDomainName = LCase(strDomainName)

If (0 = StrComp("hostheader1.dev.alfasierrapapa.com",strDomainName)) Then
%>
	<!--#include file="hostheader1.asp"-->
<%
Else
%>
	<!--#include file="hostheader2.asp"-->
<%
End If
%>

Diese Variante demonstriert auch die Nicht-Verwendung von Session-Cookies durch Einsatz der EnableSessionState Direktive. Dadurch erhält der Benutzer keinen Cookie wenn er die Hauptseite ansurft.

Sind die inkludierten Dateien komplizierter, oder inkludieren dieselben Funktionsbibliotheken, dann ist dieser Ansatz natürlich in dieser Art und Weise nicht möglich. Aber man kann die entsprechenden Dateien jedoch mit Server.Transfer oder Server.Execute (in diesem Falle nach Belieben verwendbar) ausführen lassen - vorausgesetzt, der Webserver läuft auf Windows 2000.

Schlußbemerkung

In diesem Artikel habe ich eine administrative als auch eine programmatische Lösung vorgestellt, wie sich mehrere Websites eine einzige IP Adresse teilen können. Erstere Variante wird dann zum Einsatz kommen wenn man selbst direkte Kontrolle über den Server hat, die letztere wenn man bei einem ISP hostet.

This printed page brought to you by AlphaSierraPapa

Download des Codes

Klicken Sie hier, um den Download zu starten.
http://www.aspheute.com/code/20000801.zip

Verwandte Artikel

Den Webserver umsiedeln (IIS 4 oder 5)
http:/www.aspheute.com/artikel/20020729.htm
Einführung in Stringoperationen
http:/www.aspheute.com/artikel/20001003.htm
Erstellung eines Intranets in ASP - Grundlagen
http:/www.aspheute.com/artikel/20010917.htm
Show me the source - Includes aufgelöst
http:/www.aspheute.com/artikel/20020503.htm

 

©2000-2006 AspHeute.com
Alle Rechte vorbehalten. Der Inhalt dieser Seiten ist urheberrechtlich geschützt.
Eine Übernahme von Texten (auch nur auszugsweise) oder Graphiken bedarf unserer schriftlichen Zustimmung.