multidomain installation. manche urls mit htaccess schützen
![](https://www.drupalcenter.de/files/imagecache/upic_mini/pictures/picture-9688.jpg)
am 23.12.2009 - 15:10 Uhr in
Hi,
ich habe eine multidomaininstallation , also mehrere domain ordner unter sites.
nun möchte ich davon einige domains freigenen, andere nicht. so wären einige domains mit htaccess geschützt andere nicht.
wenn ich eine htaccess in einen der ordner sites/website.de lege ist diese seite nicht geschützt, obwohl sie ja eigentlich sollte....
wie bekomme ich das hin?
- Anmelden oder Registrieren um Kommentare zu schreiben
.htaccess für Verzeichnisschutz einrichten
am 23.12.2009 - 17:31 Uhr
Die Datei muss .htaccess heißen (Punkt vor htaccess).
Die Einträge dieser Datei gelten rekursiv auch für Unterverzeichnisse; soll es da eine Ausnahme geben, müßte man für das Unterverzeichnis eine eigene .htaccess-Datei erstellen und den Verzeichnisschutz dort wieder aufheben.
Wenn eine .htaccess schon besteht, dann musst Du diese editieren (andernfalls eine neue erstellen) und am besten an den Anfang folgende Zeilen setzen:
AuthType Basic
AuthName "StrengGeheim"
AuthUserFile /var/www/web24/.htpasswd
require valid-user
Dabei muss der Eintrag für AuthUserFile bzgl. der Pfadgegebenheiten an Deine Webserver-Verhältnisse angepasst werden. Die Datei .htpasswd sollte außerhalb des DOCUMENT_ROOT liegen, also wenn Dein htdocs- oder www-Verzeichnis oder wie auch immer dieser öffentlich erreichbare Wurzelordner (bzw. eben: DOCUMENT_ROOT) bei Dir heißt wie folgt: /var/www/example.com/htdocs - dann sollte die .htpasswd am besten unter /var/www/example.com/ abgelegt werden. In diese hinein musst Du die Benutzer-/Kennworthash-Kombinationen schreiben, die zum geschützen DOC_ROOT Zugang haben sollen, also in Deinem Fall wahrsch. nur 1 solches Pärchen: für Dich selber. Das könnte für die .htpasswd dann so aussehen:
isabell:fYX5x.ra.6st.
Das, was da nach dem Doppelpunkt zu sehen ist, ist eine Art verschlüsseltes Passwort, anhand dessen dann geprüft wird, ob isabell zugreifen darf (nämlich genau dann, wenn ihr eingegebenes Passwort stimmt). Falls Du irgendwo Linux-/MacOSX-/Ubuntu-Zugriff haben solltest: da ließe sich der .htpasswd-Eintrag in der Shell z.B. so erzeugen:
htpasswd -bc .htpasswd isabell geheimespasswort
Andernfalls gibt es, glaube ich, auch Online-Tools, die so etwas erzeugen; danach müßte man dann über Suchmaschinen suchen.
Oder ...
am 23.12.2009 - 17:39 Uhr
..., um zur Abwechslung auf Deine Frage zu antworten, :)
schalte einfach den Wartungsmodus für diejenigen Sites ein, die noch nicht erreichbar sein sollen.
bitte nochmal hilfe
am 23.12.2009 - 18:25 Uhr
danke erstmal.
also website offline schalten geht nicht da ich da interne portale habe an denen gearbeitet wird, und das mit verschiedennen benutzern.
ich habe ja eine .htaccess datei in den ordner sites/domain.de gelegt. allerdings verhindert diese nicht dass ich auf diese url komme. .....
das erstellen der htaccess datei ist kein problem....
an alle mit multsite-erfahrung :)
am 23.12.2009 - 19:12 Uhr
ich habe nochmal alles verscuht.
ich habe zum beispiel in den root drupal ordner eine htaccess gelegt die den zugriff verbietet und in den ordner sites/domain dann eine htaccess die den zugriff für diesen ordner erlaubt. auch das geht nicht.
wie macht man das in drupal nun um den zugang nur zu einigen bestimmten domains einer multi site installation zu erlauben?
besten dank
Via .htacces ginge das
am 21.02.2010 - 12:57 Uhr
Via .htacces ginge das überhaupt nur unter der Bedingung, dass es eine Auth-Möglichkeit gibt, die bedingt (anhand der Variable %{HTTP_HOST}) erfolgt. So eine Möglichkeit ist mir selbst momentan nicht bekannt, kann es aber durchaus geben. Da wäre dann eher ein Apache-Forum der richtige Ort zum Fragen für so einen trickreichen Task.
Ein ganz anderer Weg zu erreichen was Du willst, wäre es, diese Restriktion mit PHP z.B. in der page.tpl.php Deines verwendeten Themes der jeweils betroffenen Domains zu erreichen: denn jede Domain kann ja themeabhängig ihre eigene page.tpl.php haben (unterhalb von sites/domain.tld/themes).
<?php
global $user;
if (arg(0) != 'user' && !$user->uid) {
// Hier landen also alle unangemeldeten Benutzer, falls sie
// nicht genau "example.com/user" (also die Anmeldung) aufrufen:
drupal_site_offline();
exit;
// Oder anstatt drupal_site_offline(): unwillkommene Besucher
// überhaupt auf die Reise schicken:
// header('Location: http:// andere-domain.tld/comingsoon');
}
?>
Das ist ungetestet- nur mal so als Idee. So hätten Drupal-authentifizierte Benutzer Zugriff (sofern sie wissen, dass sie an den Domainnamen "/user" anhängen müssen und falls sie nicht permanent angemeldet sind); alle anderen "Gäste" ($user->uid == 0) schickt man halt nach Belieben irgendwohin.
Dieser PHP-Block sollte dann ganz am Anfang der page.tpl.php stehen.
EDIT: Eben einmal aus konkretem Anlass getestet. drupal_access_denied() am Beginn der page.tpl.php führt zu einem Endlos-Loop, da ja für die Nachricht immer wieder die page.tpl.php aufgerufen wird. drupal_site_offline() funktioniert wie gewünscht, sofern ein exit; nachgesetzt wird. Der Code oben funktioniert für mich jetzt so "as is". Für jede Domain, auf die kein Zugriff für unangemeldete Benutzer bestehen soll, kopiert man den Code an den Beginn der betreffenden page.tpl.php, gleich nach dem öffnenden
<?php
-Tag. Sogar das erratbare "domain.tld/user" könnte letztlich noch vermieden werden und auf eine beliebige URL gelegt werden ... - Lassen wir's aber gut sein ...Danke für die Antwort. Ich
am 24.12.2009 - 07:39 Uhr
Danke für die Antwort. Ich muss das echt gelöst bekommen.
Dein Ansatz klingt gut, allerdings darf der Inhalt auf keinen fall ausgelesen werden, gar keinen Fall. (muss aber online sein, da mehrere Autoren)
Nun stellt sich für mich erst einmal eine grundsätzliche Frage: wie funktionieren Multisites.
In den Ordnern sites/domain liegen die settings.php für die jeweilige Installation. Lege ich in diesen Ordner eine htaccess wird die Domain nicht geschützt. Drupal muss also nur die htaccess auf root ebene prüfen und dann irgendwie an die zugangsdaten für die domain/subdomain gelagen. Wenn ich verstehen würde wie das Drupalintern funktioniert könnte ich auch besser begreifen weshalb das mit der htaccess nicht geht.
Drupal greift nicht auf die
am 24.12.2009 - 12:43 Uhr
Drupal greift nicht auf die .htaccess zu, sondern der Apache. Die .htaccess "schützt" daher nicht vor dem Auslesen von Vereichnissen durch Skripte und soll es auch gar nicht. Sie schützt dagegen gegen den Direktzugriff via http - und dazu ist sie auch da.
Generell ist es nicht unsicherer, Inhalte auf Skriptebene zu schützen (sofern man eben keine Programmierfehler macht). Du vertraust dem Vorgang doch auch, wenn Du authentifizierte Benutzer zuläßt, die sich durch einen Programmierfehler ebenso Admin-Rechte verschaffen könnten.
Wenn alle angemeldeten Besucher Zugriff haben sollen, der Rest der Welt aber auf eine andere Domain oder eine bestimmte Page geleitet werden sollen, stellt sich immer noch die Frage, wie die sich die "Berechtigten" denn überhaupt anmelden sollen, da sie ja in diesem Moment noch zum "Rest der Welt" zählen. Darauf hast ja oben eine mögliche Antwort bekommen.
Hast Du mal Apache-Profis (in einem Forum) gefragt, ob .htaccess' Basic Auth in Abhängigkeit von HTTP_HOST erzwungen werden kann? Wenn ja, kann das eine andere mögliche Lösung sein.
auch ich habe nicht ganz
am 25.12.2009 - 13:38 Uhr
auch ich habe nicht ganz verstanden weshalb eine htaccess datei die in dem ordner der domain liegt nicht beachtet wird.
vielleicht kann das nochmal jemand erklären. die htaccess dateien im haupt-installationsordner von drupal werden hingegegn schon beachtet.
die htaccess sollte doch ein ordner schutz sein. nun liegen in den ordnern sites/domain die settings.php. mir ist nicht verständlich wie diese domain daten aus der datenbank abrufen kann wenn doch all diese daten in der settings.php liegen, also in dem ordner in dem auch die htaccess datein liegen.
ich stehe vor einem ähnlichen problem und löse das bisher damit dass ich alle inhalte für gäste Über benutzer > berechtigungen ausblende. ist aber nicht schön, da die navigation bereits eingeblendet wird. die seite von "wartung" gefällt mir überhaupt nicht da es immer das garland theme nimmt, auich wenn ich mein eingenes theme aktiviert habe.
also ich lese aufmerksam mit wo der grund liegt dass die htaccess nicht beachtet wird, mit meinem kentnisstand völlig unlogisch :)
Ganz logisch
am 25.12.2009 - 14:16 Uhr
Wie schon im vorigen Beitrag steht: die .htaccess wird nicht von Drupal gelesen und/oder interpretiert, sondern vom Apache Webserver. Diese Datei steuert die Zugriffe von außen auf den Webspace. Die Funktionsweise einer .htaccess hat zunächst einmal überhaupt nichts mit Drupal zu tun.
Drupal stellt aber eine .htaccess bereit, um dem Webserver mitzuteilen, welche webserverseitigen Bedingungen der Apache für Drupal bereitstellen soll. Wenn ein Drupal-PHP-Skript andere PHP-Dateien einliest, dann ist dies von einer im Skript-Verzeichnis bestehenden .htaccess völlig unabhängig, da hier gar kein Webserver-Zugriff über den Webserver erfolgt, sondern ein PHP-Zugriff, welchem .htaccess-Dateien wirklich vollkommen gleichgültig sind. Der Skriptzugriff seinerseits scheitert allenfalls an Dateirechten, nicht aber an Webserver-Konfigurationsdateien.
Die Funktionsweise der Multidomain-Konstellation von Drupal wird von Drupal selbst (also über PHP-Skripte) gesteuert, nicht vom Apache. Deswegen kann man soviel .htaccess-Dateien in die sites/example.com-Verzeichnisse legen wie man will, das bewirkt nur, dass einer, der über den Webbrowser z.B. http://mysite.net/sites/example.com/settings.php aufruft, von der .htaccess ggf. etwas auf die Finger bekommt, wenn das darin so vorgesehen ist - mehr bewirkt das aber nicht.
Deswegen ist für Drupal-Multidomain-Installationen sehr wahrscheinlich eine skriptgesteuerte Zugriffsbeschränkung die angemessenere. Falls nicht, wie gesagt, dem Apache (via .htaccess) beigebracht werden kann, in Abhängigkeit von der Variable HTTP_HOST (da steht der Domainname drinnen, anhand dessen Drupal ja auch seine Multidomain-Verzweigungen vornimmt) eine Authentifizierung zu erzwingen.
Ist das so klarer?
Warum einer, wer immer dieses Problem hat, nicht einmal den kleinen Vierzeiler oben in eine domainabhängige page.tpl.php kopiert und hier Feedback gibt, verstehe ich nicht. Lest Ihr lieber Romane? Da gibt es besseres als so etwas hier :)