Wie verwende ich einen RELATIVEN Pfad mit AuthUserFile in htaccess?

98

Ich habe einen .htaccess, der die Basisauthentifizierung verwendet. Es scheint, dass der Pfad zur .htpasswd-Datei nicht relativ zur htaccess-Datei ist, sondern zur Serverkonfiguration.

Obwohl ich die Dateien .htaccess und .htpasswd im selben Verzeichnis habe, funktioniert dies nicht:

AuthType Basic
AuthName "Private Login"
AuthUserFile .htpasswd
Require valid-user

Es funktioniert jedoch, wenn ich die AuthUserFile so ändere, dass der absolute Pfad verwendet wird:

AuthType Basic
AuthName "Private Login"
AuthUserFile "/home/user/public_html/mydir/.htpasswd"
Require valid-user

Ich würde jedoch etwas Mobileres bevorzugen, da ich dies auf mehreren Websites in verschiedenen Bereichen verwende. Ich habe im Internet gesucht, aber keine Lösung gefunden. Ist es möglich, relative Pfade oder Variablen wie zu verwenden %{DOCUMENT_ROOT}?

DssTrainer
quelle

Antworten:

51

Es ist nicht möglich, relative Pfade für AuthUserFile zu verwenden :

Dateipfad ist der Pfad zur Benutzerdatei. Wenn es nicht absolut ist (dh wenn es nicht mit einem Schrägstrich beginnt), wird es als relativ zum behandelt ServerRoot.

Sie müssen diese Einschränkung akzeptieren und umgehen.


Wir verwenden IfDefinezusammen mit einem apache2- Befehlszeilenparameter :

.htaccess (sowohl für Entwicklungs- als auch für Live-Systeme geeignet):

<IfDefine !development>
  AuthType Basic
  AuthName "Say the secret word"
  AuthUserFile /var/www/hostname/.htpasswd
  Require valid-user
</IfDefine>

Entwicklungsserverkonfiguration (Debian)

Fügen Sie Folgendes hinzu /etc/apache2/envvars:

export APACHE_ARGUMENTS=-Ddevelopment

Starten Sie Ihren Apache anschließend neu und Sie erhalten nur dann eine Kennwortabfrage, wenn Sie sich nicht auf dem Entwicklungsserver befinden.

Sie können natürlich ein weiteres IfDefine für den Entwicklungsserver hinzufügen, kopieren Sie einfach den Block und entfernen Sie den !.

cweiske
quelle
4
Dabei wird jedoch immer noch ein absoluter Pfad ( /var/...) verwendet - und die Frage lautet: "Wie wird ein relativer Pfad verwendet?"
Sdaau
1
Und dann wurde die Frage bearbeitet, um richtig mit einem "Nein" zu antworten :)
Erenor Paz
15

Für den Fall, dass die Leute nach einer Lösung dafür suchen:

<If "req('Host') = 'www.example.com'">
    Authtype Basic
    AuthName "user and password"
    AuthUserFile /var/www/www.example.com/.htpasswd
    Require valid-user
</If>
mask8
quelle
1
Das wäre großartig, aber ist es sicher, sich darauf zu verlassen req('Host'), kann der Kunde diesen Wert nicht austricksen?
Marco Demaio
1
@MarcoDemaio Ja, es kann / könnte ausgetrickst werden, indem beispielsweise die IP-Adresse verwendet wird. Dies hängt von Ihrer Konfiguration ab. Es ist kein absolutes Ja oder Nein. Es hängt davon ab, ob.
Maxime
12

1) Beachten Sie, dass es als unsicher angesehen wird, wenn sich die .htpasswdDatei unter dem Serverstamm befindet.

2) Die Dokumente sagen dies über relative Pfade, so dass es so aussieht, als hätten Sie kein Glück:

Dateipfad ist der Pfad zur Benutzerdatei. Wenn es nicht absolut ist (dh wenn es nicht mit einem Schrägstrich beginnt), wird es als relativ zum ServerRoot behandelt .

3) Während die Antworten, die die Verwendung von Umgebungsvariablen empfehlen, einwandfrei funktionieren, würde ich lieber einen Platzhalter in die .htaccessDatei einfügen oder verschiedene Versionen in meiner Codebasis haben und den Bereitstellungsprozess alles einrichten lassen (dh Platzhalter ersetzen oder umbenennen / Verschieben Sie die entsprechende Datei).

In Java-Projekten verwende ich Maven, um diese Art von Arbeit zu erledigen. In PHP-Projekten möchte ich beispielsweise ein Shell-Skript build.sh und / oder install.sh haben, das die bereitgestellten Dateien an ihre Umgebung anpasst. Dadurch wird Ihre Codebasis von den Besonderheiten der Zielumgebung (dh den Umgebungsvariablen und Konfigurationsparametern) entkoppelt. Im Allgemeinen sollte sich die Anwendung an die Umgebung anpassen. Wenn Sie es umgekehrt machen, können Probleme auftreten, wenn die Umgebung auch unterschiedliche Anwendungen oder völlig unabhängige systemspezifische Anforderungen berücksichtigen muss.

Hanno Fietz
quelle
8

Sie können Ihre Auth-Einstellungen in eine Umgebung stellen. Mögen:

SetEnvIf HTTP_HOST testsite.local APPLICATION_ENV=development
<IfDefine !APPLICATION_ENV>
  Allow from all
  AuthType Basic
  AuthName "My Testseite - Login" 
  AuthUserFile /Users/tho/htdocs/wgh_staging/.htpasswd
  Require user username
</IfDefine>

Die Auth funktioniert, aber ich konnte meine Umgebung nicht wirklich zum Laufen bringen.

digitaldonkey
quelle
1
Ich denke, das Problem ist folgendes: "Nur die Umgebungsvariablen, die durch frühere SetEnvIf [NoCase] ​​-Anweisungen definiert wurden, können auf diese Weise getestet werden. 'Früher' bedeutet, dass sie in einem breiteren Bereich (z. B. serverweit) oder zuvor in definiert wurden den Geltungsbereich der aktuellen Richtlinie. " (hier zu finden: askapache.com/htaccess/setenvif.html ) Da Sie denselben Bereich haben, konnten Sie Ihre Umgebung nicht zum Laufen bringen.
user470370
4
Warum dies nicht funktioniert, wird hier außergewöhnlich gut erklärt. stackoverflow.com/questions/11073752/…
nico gawenda
Dabei wird jedoch immer noch ein absoluter Pfad ( /Users/...) verwendet - und die Frage lautet: "Wie wird ein relativer Pfad verwendet?"
Sdaau
Ja. Sie können jedoch mehrere APPLICATION_ENV-Einstellungen verwenden, um mehrere absolute Pfade pro Umgebung zu verwenden.
Digitaldonkey
5

.htpasswd erfordert einen vollständigen absoluten Pfad vom absoluten Stamm des Servers.

Bitte erhalten Sie den vollständigen absoluten Pfad der Datei per Echo echo $_SERVER['DOCUMENT_ROOT'];.

Hier funktioniert das grundlegende Auth .htaccess-Skript.

AuthType Basic
AuthName "Access to the Hidden Files"
AuthUserFile 'C:/xampp/htdocs/ht/.htpasswd'
Require valid-user

Vor dem Login

Geben Sie hier die Bildbeschreibung ein

Afetr Login

Geben Sie hier die Bildbeschreibung ein

Muni
quelle
3

Wenn Sie versuchen, XAMPP unter Windows zu verwenden und eine .htaccess-Datei auf einem Live-Server verwenden und auch auf einem XAMPP-Entwicklungscomputer entwickeln möchten, funktioniert Folgendes hervorragend!


1) Stellen Sie nach einer Neuinstallation von XAMPP sicher, dass Apache als Dienst installiert ist.

  • Öffnen Sie dazu die XAMPP-Systemsteuerung und klicken Sie auf das kleine rote "X" links neben dem Apache-Modul.
  • Sie werden dann gefragt, ob Sie Apache als Dienst installieren möchten.
  • Dann sollte es zu einem grünen Häkchen werden.

2) Wenn Apache als Dienst installiert ist, fügen Sie eine neue Umgebungsvariable als Flag hinzu.

  • Beenden Sie zuerst den Apache-Dienst in der XAMPP-Systemsteuerung.
  • Öffnen Sie als nächstes eine Eingabeaufforderung. (Sie kennen das kleine schwarze Fenster, das DOS simuliert)
  • Art Sie "C: \ Program Files (x86) \ xampp \ apache \ bin \ httpd.exe" -D "DEV" -k Config .
  • Dadurch wird ein neues DEV- Flag an die Umgebungsvariablen angehängt, die Sie später verwenden können.

3) Starten Sie Apache

  • Öffnen Sie die XAMPP-Systemsteuerung und starten Sie den Apache-Dienst.

4) Erstellen Sie Ihre .htaccess-Datei mit den folgenden Informationen ...

<IfDefine DEV>
  AuthType Basic
  AuthName "Authorized access only!"
  AuthUserFile "/sandbox/web/scripts/.htpasswd"
  require valid-user
</IfDefine>

<IfDefine !DEV>
  AuthType Basic
  AuthName "Authorized access only!"
  AuthUserFile "/home/arvo/public_html/scripts/.htpasswd"
  require valid-user
</IfDefine>

Um das obige Skript hier zu erklären, sind ein paar Anmerkungen ...

  • Meine AuthUserFile basiert auf meinem Setup und meinen persönlichen Einstellungen.
  • Ich habe eine lokale Testentwicklungsbox, deren Webseite sich unter c: \ sandbox \ web \ befindet . In diesem Ordner befindet sich ein Ordner namens scripts , der die Kennwortdatei .htpasswd enthält .
  • Der erste Eintrag IfDefine DEV wird für diese Instanz verwendet. Wenn DEV gesetzt ist (was wir oben nur auf der groben Entwicklungsmaschine getan haben), wird dieser Eintrag verwendet.
  • Und wenn Sie den Live-Server verwenden, wird IfDefine! DEV verwendet.

5) Erstellen Sie Ihre Passwortdatei (in diesem Fall .htpasswd) mit den folgenden Informationen ...

Benutzer: $ apr1 $ EPuSBcwO $ / KtqDUttQMNUa5lGXSOzk.

Ein paar Dinge zu beachten ...

Arvo Bowen
quelle
Dabei wird jedoch immer noch ein absoluter Pfad ( /home...) verwendet - und die Frage lautet: "Wie wird ein relativer Pfad verwendet?"
Sdaau
2

oder wenn Sie auf localhost entwickeln (nur für Apache 2.4+):

<If "%{REMOTE_ADDR} != '127.0.0.1'">
</If>
amxm
quelle
1

Ich weiß, dass dies eine alte Frage ist, aber ich habe nur nach dem gleichen Thema gesucht, und wahrscheinlich suchen viele andere nach einer schnellen, mobilen Lösung. Folgendes habe ich mir endlich ausgedacht:

# We set production environment by default
SetEnv PROD_ENV 1

<IfDefine DEV_ENV>
  # If 'DEV_ENV' has been defined, then unset the PROD_ENV
  UnsetEnv PROD_ENV

  AuthType Basic
  AuthName "Protected Area"
  AuthUserFile /var/www/foo.local/.htpasswd
  Require valid-user
</IfDefine>

<IfDefine PROD_ENV>
  AuthType Basic
  AuthName "Protected Area"
  AuthUserFile /home/foo/public_html/.htpasswd
  Require valid-user
</IfDefine>
ovi
quelle
Dabei wird jedoch immer noch ein absoluter Pfad ( /var...) verwendet - und die Frage lautet: "Wie wird ein relativer Pfad verwendet?"
Sdaau
1
Ja, es handelt sich um eine Problemumgehung, da Apache keine relativen Pfade zum Speicherort der .htaccessDatei unterstützt. Wenn Sie einen relativen Pfad verwenden, wird dieser als relativ zum Pfad betrachtet ServerRoot.
Ovi
1

Nehmen wir ein Beispiel.

Ihre Anwendung befindet sich in / var / www / myApp auf einem Linux-Server

.htaccess : /var/www/myApp/.htaccess

htpasswdApp : / var / www / myApp / htpasswdApp . (Sie können einen beliebigen Namen für .htpasswd verwenden Datei verwenden.)

So verwenden Sie den relativen Pfad in .htaccess :

AuthType Digest
AuthName myApp
AuthUserFile "htpasswdApp"
Require valid-user

Es wird jedoch nach einer Datei im Verzeichnis server_root gesucht . Nicht in document_root .

In unserem Fall, wenn sich die Anwendung unter / var / www / myApp befindet :

document_root ist / var / www / myApp

server_root ist / etc / apache2 // (nur in unserem Beispiel, weil wir den Linux-Server verwenden )

Sie können es in Ihrer Apache-Konfigurationsdatei ( /etc/apache2/apache2.conf) neu definieren ) neu definieren, aber ich denke, es ist eine schlechte Idee.

Um den relativen Dateipfad in Ihrem /var/www/myApp/.htaccess zu verwenden , sollten Sie die Datei des Kennworts in Ihrer server_root definieren .

Ich mache es lieber mit folgendem Befehl:

sudo ln -s /var/www/myApp/htpasswdApp /etc/apache2/htpasswdApp

Sie können meinen Befehl kopieren, einen festen Link anstelle eines Symbols verwenden oder eine Datei auf Ihre server_root kopieren .

Sild
quelle
1
Da Apache standardmäßig den Zugriff auf Dateien blockiert, die mit .ht * beginnen, wird nicht empfohlen, zufällige Namen für diese zu verwenden.
Cari