Eine IP Adresse für mehrere Websites
Geschrieben von: Christoph Wille 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 AdresseDie 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 WebsiteAuch 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 RedirectsDie 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 IncludesDie 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ßbemerkungIn 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. Download des CodesKlicken Sie hier, um den Download zu starten. Verwandte Artikel
Den Webserver umsiedeln (IIS 4 oder 5) Wenn Sie jetzt Fragen haben...Wenn Sie Fragen rund um die in diesem Artikel vorgestellte Technologie haben, dann schauen Sie einfach bei uns in den Community Foren der deutschen .NET Community vorbei. Die Teilnehmer helfen Ihnen gerne, wenn Sie sich zur im Artikel vorgestellten Technologie weiterbilden möchten. Haben Sie Fragen die sich direkt auf den Inhalt des Artikels beziehen, dann schreiben Sie dem Autor! Unsere Autoren freuen sich über Feedback zu ihren Artikeln. Ein einfacher Klick auf die Autor kontaktieren Schaltfläche (weiter unten) und schon haben Sie ein für diesen Artikel personalisiertes Anfrageformular.
Und zu guter Letzt möchten wir Sie bitten, den Artikel zu bewerten. Damit helfen Sie uns, die Qualität der Artikel zu verbessern - und anderen Lesern bei der Auswahl der Artikel, die sie lesen sollten.
©2000-2006 AspHeute.com |