Frage

Ich habe mich gefragt, ob es möglich ist, eine bedingte http-Basisauthentifizierungsanforderung basierend auf der URL des virtuellen Hosts in einer .htaccess-Datei einzurichten.

Ich möchte beispielsweise, dass mysite.com und test.mysite.com von derselben Codebasis im selben Verzeichnis ausgeführt werden, aber test.mysite.com durch ein Kennwort schützen.Es würde so eingerichtet, dass ich meinen Code nicht verzweigen muss, da mein App-Code sehen kann, von welchem vhost / welcher URL er bereitgestellt wird, und die Datenbank auswählen kann, von der Inhalte bereitgestellt werden sollen.

War es hilfreich?

Lösung

Sie können dies kludgen, indem Sie mod_setenvif zusammen mit den mod_auth-Modulen verwenden.Verwenden Sie die Anweisung SetEnvIfNoCase, um festzulegen, welcher Host kennwortgeschützt ist.Sie benötigen einige zusätzliche Anweisungen, um den Zugriff zu gewährleisten:

# Check for the hostname here
SetEnvIfNoCase HOST ^test\.mysite\.com\.?(:80)?$ PROTECTED_HOST

Dann haben Sie im Directory-Block (oder einfach im Freien) Ihr Auth-Zeug eingerichtet, ungefähr so:

AuthUserFile /var/www/test.mysite.com/htpasswd
AuthType Basic
AuthName "Password Protected"

Nun zu den Anforderungen / Befriedigungen:

Order Deny,Allow
Satisfy any
Deny from all
Require valid-user
Allow from env=!PROTECTED_HOST

Dadurch hat jeder Host, der nicht mit ^test\.mysite\.com\.?(:80)?$ übereinstimmt, Zugriff ohne Authentifizierung (Allow from env=!PROTECTED_HOST). Andernfalls benötigen wir einen gültigen Benutzer (Require valid-user).Der Satisfy any stellt sicher, dass wir nur eine der beiden benötigen, entweder Allow oder Require.

Andere Tipps

Ich hatte Probleme bei der Implementierung von Jons Lösung: Obwohl ich mit Apache conf und regulären Ausdrücken ziemlich vertraut bin, wurde die Authentifizierung immer ausgelöst.Aus einer schnellen Analyse ging hervor, dass die Allow from env=!PROTECTED_HOST-Zeile nicht aktiviert wurde.

Aber ich habe eine andere Lösung gefunden, die für mich tatsächlich sicherer aussieht:

Ich habe zwei virtuelle Hosts für die beiden Domänen erstellt, die auf denselben Dokumentstamm verweisen (was übrigens vollständig zulässig ist).In einem der vhosts habe ich die Direktiven für die Basisauthentifizierung hinzugefügt (direkt in den vhost-Direktivenblock).

Funktioniert wie ein Zauber.Und ich habe ein besseres Gefühl, dass dies wirklich sicher ist - kein Risiko, Details im Regex-Muster zu übersehen, die die Tore für Eindringlinge öffnen würden.

<VirtualHost *:80>
    ServerName www.mysite.com
    DocumentRoot "/path/to/common/doc/root"

    <Directory "/path/to/common/doc/root">
        Options Indexes FollowSymLinks
        AllowOverride All
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>

<VirtualHost *:80>
    ServerName protected.mysite.com
    DocumentRoot "/path/to/common/doc/root"

    <Directory "/path/to/common/doc/root">
        Options Indexes FollowSymLinks
        AllowOverride All
        Order allow,deny
        Allow from all

        AuthUserFile /path/to/htpasswd
        AuthName "Password please"
        AuthType Basic
        Require valid-user
    </Directory>
</VirtualHost>

Hier ist eine Lösung ähnlich der von Jon Lin vorgeschlagenen, jedoch mit RewriteCond, um den Hostnamen zu überprüfen:

RewriteEngine On
RewriteCond %{HTTP_HOST} =protected.hostname.com
RewriteRule ^.*$ - [E=DENY:1]

AuthUserFile /path/to/htpasswd
AuthName "Password please"
AuthType Basic

Order Deny,Allow
Satisfy any
Deny from all
Require valid-user
Allow from env=!DENY

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top