it-swarm.com.de

Schützen Sie eine bestimmte URL mit einem Kennwort

Die Website befindet sich auf Shared Hosting. Ich muss eine einzelne URL mit einem Kennwort schützen.

http://www.example.com/pretty/url

Offensichtlich ist dies kein physischer Dateipfad, den ich schützen möchte, es ist nur diese bestimmte URL.

Jede schnelle Lösung mit .htaccess?

29
BadHorsie

Sie sollten dazu in der Lage sein, die Kombination von mod_env und der Direktive Satisfy any zu verwenden. Sie können SetEnvIf verwenden, um den Request_URI zu überprüfen, auch wenn es sich nicht um einen physischen Pfad handelt. Sie können dann prüfen, ob die Variable in einer Allow-Anweisung festgelegt ist. Sie müssen sich also entweder mit einem Passwort anmelden oder die Allow lässt Sie ohne Passwort ein:

# Do the regex check against the URI here, if match, set the "require_auth" var
SetEnvIf Request_URI ^/pretty/url require_auth=true

# Auth stuff
AuthUserFile /var/www/htpasswd
AuthName "Password Protected"
AuthType Basic

# Setup a deny/allow
Order Deny,Allow
# Deny from everyone
Deny from all
# except if either of these are satisfied
Satisfy any
# 1. a valid authenticated user
Require valid-user
# or 2. the "require_auth" var is NOT set
Allow from env=!require_auth
62
Jon Lin

Sie können dazu <LocationMatch> oder einfach <Location> in Ihrer <VirtualHost>-Direktive verwenden (vorausgesetzt, Sie haben Zugriff auf Ihre httpd.conf/vhost.conf - alternativ könnten Sie einen ähnlichen Befehl in einen .htaccess in Ihr Dokumentstammverzeichnis einfügen, wenn Sie Ihre Site konfigurieren müssen dieser Weg).

Zum Beispiel:

<VirtualHost *:80>
  ServerName www.example.com
  DocumentRoot /var/www/blabla
  # Other usual vhost configuration here
  <Location /pretty/url>
    AuthUserFile /path/to/.htpasswd
    AuthGroupFile /dev/null
    AuthName "Password Protected"
    AuthType Basic
    require valid-user
  </Location>
</VirtualHost>

<LocationMatch> ist möglicherweise nützlicher, wenn Sie einen regulären Ausdruck mit Ihrer hübschen URL abgleichen möchten. Die Dokumentation ist hier .

14
Coder

Da Rick in einem Kommentar angegeben hat, dass keine Antwort auf diese Frage funktioniert, ist hier der Ausschnitt, den ich verwende:

AuthName "Protected Area"
AuthType Basic
AuthUserFile /path/to/your/.htpasswd
AuthGroupFile /dev/null

SetEnvIf Request_URI .* noauth
SetEnvIf Request_URI the_uri_you_want_to_protect !noauth
SetEnvIf Request_URI another_uri !noauth
SetEnvIf Request_URI add_as_many_as_you_want !noauth

<RequireAny>
  Require env noauth
  Require valid-user
</RequireAny>

Wenn Sie Unterstützung für Apache 2.2 UND Apache 2.4 benötigen (anscheinend gibt es Setups, bei denen beide Versionen parallel laufen ...):

AuthName "Protected Area"
AuthType Basic
AuthUserFile /path/to/your/.htpasswd
AuthGroupFile /dev/null

SetEnvIf Request_URI .* noauth
SetEnvIf Request_URI the_uri_you_want_to_protect !noauth
SetEnvIf Request_URI another_uri !noauth
SetEnvIf Request_URI add_as_many_as_you_want !noauth

<IfModule mod_authz_core.c>
    <RequireAny>
        Require env noauth
        Require valid-user
    </RequireAny>
</IfModule>

<IfModule !mod_authz_core.c>
    Order Deny,Allow
    Deny from all
    Satisfy any
    Require valid-user
    Allow from env=noauth
</IfModule>

Der Code für Apache 2.2 stammt von Jon Lin .

7
Pharaoh

Alle angebotenen Lösungen funktionierten nicht für mich. Ich habe herausgefunden, dass folgende Anweisungen den Trick tun:

SetEnvIf Request_URI ^/page-url auth=1

AuthName "Please login"
AuthType Basic
AuthUserFile "/www/live.example.com/files/html/.htpasswd"

# first, allow everybody
Order Allow,Deny
Satisfy any
Allow from all
Require valid-user
# then, deny only if required
Deny from env=auth
4
Stefan

Ich habe den Code von Jon Lin aktualisiert, um alle URLs außer einer zu schützen - beispielsweise robots.txt im Stammverzeichnis des vhost. Dies sind Richtlinien, die mit Apache 2.2 kompatibel sind.

<ifmodule mod_setenvif.c>
SetEnv  require_no_auth=false
SetEnvIf Request_URI "^/robots.txt" require_no_auth=true

AuthType Basic
AuthName "Restricted"
AuthUserFile /home/someuser/.htpasswd

# Setup a deny/allow
Order Deny,Allow
# Deny from everyone
Deny from all
# 1. a valid authenticated user
Require valid-user
# or 2. the "require_no_auth" var is set
Allow from env=require_no_auth
# except if either of these are satisfied
Satisfy any
</ifmodule>

Gleicher Code für Apache 2.4

<ifmodule mod_setenvif.c>
SetEnv  require_no_auth=false
SetEnvIf Request_URI "^/robots.txt" require_no_auth=true

AuthType Basic
AuthBasicProvider file
AuthName "Restricted"
AuthUserFile /home/someuser/.htpasswd

# grant access if either of these are satisfied
# 1. a valid authenticated user
Require valid-user
# or 2. the "require_no_auth" var is set
Require env require_no_auth
</ifmodule>
1
Pierre Priot
  1. Zunächst müssen Sie einen neuen Benutzer/ein neues Passwort erstellen:

Dieser Befehl:

htpasswd -c /etc/Apache2/.htpasswd myuser1

Wenn Sie Bitnami Apps (Open edx zum Beispiel) verwenden, müssen Sie diese Anweisung befolgen:

htpasswd -c /opt/bitnami/apps/edx/conf/.htpasswd myuser1
  1. Wenn Sie dann einen virtuellen Host definiert haben, müssen Sie Ihrer Apache-Konfigurationsdatei die folgenden Zeilen hinzufügen.

Diese Konfiguration:

<VirtualHost *:80>
...

<Location />
    Deny from all
    #Allow from (Set IP to allow access without password)
    AuthUserFile /etc/Apache2/.htpasswd
    AuthName "Restricted Area"
    AuthType Basic
    Satisfy Any
    require valid-user
</Location>
...

</VirtualHost>
  1. Bei Bitnami-Apps müssen Sie diese Konfigurationen in '/ opt/bitnami/apps/edx/conf/httpd-lms.conf' einfügen. :

Diese Konfiguration zum Schutz aller URLs:

<Location />
    Deny from all
    #Allow from (Set IP to allow access without password)
    AuthUserFile /opt/bitnami/apps/edx/conf/.htpasswd
    AuthName "Restricted Area"
    AuthType Basic
    Satisfy Any
    require valid-user
</Location>
  1. Schließlich müssen Sie den Apache-Server neu starten.

In Bitnami Apps:

/opt/bitnami/ctlscript.sh restart Apache
0
Mohammad

Wie kann ich den Benutzer in einen passwortgeschützten Unterordner umleiten? 

.zugang

RewriteCond %{HTTP_COOKIE} !BadHorsie=secret_cookie_key
RewriteRule ^(pretty/url)$ /protected/login.php?url=$1 [R=307,L]

geschützt/.htaccess

AuthUserFile /usr/www/{YOUR_PATH}/protected/.htpasswd
AuthGroupFile /dev/null
AuthName "Protected"
AuthType Basic
require user BadHorsie

geschützt/.htpasswd

BadHorsie:$apr1$fFbaaVdF$Q5ql58g7R4qlpMUDb/5A0/

protected/login.php

<?php
if (isset($_GET['url']) && $_GET['url'] && $_GET['url'][0] != '/' && strpos($_GET['url'], '//') === false) {
    setcookie('BadHorsie', 'secret_cookie_key', 0, '/');
    header('Location: /' . $_GET['url'], true, 307);
    exit;
}
?>

Was geschieht

  1. Benutzeranfragen example.com/pretty/url
  2. 307 Weiterleitung zu example.com/protected/login.php?url=pretty/url
  3. anmeldung
  4. bei Erfolg: Der Benutzer erhält ein Session-Cookie mit einem geheimen Schlüssel
  5. 307 Weiterleitung zu example.com/pretty/url
  6. Benutzer erhält geheimen Inhalt

Hinweis: Natürlich ist der "Session-Cookie und Back-Redirecting" -Mechanismus vollständig optional. Schließlich können Sie Ihre geheimen Inhalte direkt über protected/login.php bereitstellen. Ich habe diesen Weg nur zur Inspiration gezeigt.

Optional: Verwenden Sie nicht PHP und setzen Sie das Cookie durch .htaccess.

0
mgutt