
Ich versuche, die Unterverzeichnisse einer Anwendung mit statischen Berichten pro Client mithilfe von .htaccess-Dateien einzuschränken, die programmgesteuert mit einer Liste von Benutzern für jeden Kunden generiert werden. Ich kann jedoch nachweisen, dass die .htaccess-Datei analysiert wird (500 ISE, wenn sie Müll enthält, AllowOverride funktioniert), aber keine der restriktiveren Require-Anweisungen überschreibt das „Require valid-user“ in der Location-Direktive höherer Ebene.
zB. /etc/httpd/conf.d/app.conf
<VirtualHost *:80>
ServerName app
RewriteEngine on
RewriteRule ^/cgi-bin\/api\/(\w+)$ /var/www/cgi-bin/App.cgi?mode=json&request=$1 [QSA,H=cgi-script]
<Directory "/var/www/cgi-bin/">
Options ExecCGI
</Directory>
<Directory "/var/www/cgi-bin/api/reports/">
AllowOverride FileInfo AuthConfig
Options +Indexes +FollowSymLinks -ExecCGI
IndexOptions +NameWidth=*
SetHandler default-handler
LogLevel trace8
</Directory>
<Location /cgi-bin/>
AuthType Basic
AuthName "App Server"
AuthUserFile /etc/httpd/conf.d/app.passwd
require valid-user
</Location>
<Location /cgi-bin/api/>
AuthType Basic
AuthName "App API"
AuthUserFile /etc/httpd/conf.d/app-api.passwd
Require valid-user
LogLevel trace8
</Location>
</VirtualHost>
/var/www/cgi-bin/api/reports/customer1/.htaccess
Require user CUSTOMER1
Ich habe LogLevel trace8 für das Berichtsverzeichnis aktiviert und sehe
AH01626: authorization result of Require valid-user : denied (no authenticated user yet)
AH01626: authorization result of <RequireAny>: denied (no authenticated user yet)
AH01626: authorization result of Require valid-user : granted,
AH01626: authorization result of <RequireAny>: granted
Response sent with status 200
nichts von dem, was ich in die .htaccess-Datei eingebe, scheint referenziert zu sein, das Einschließen von Require-Anweisungen in RequireAll bewirkt nichts, das Festlegen von „Require all denied“ bewirkt nichts, Apache behandelt die .htaccess-Direktiven nicht als spezifischer als die Location-Direktive in der Konfiguration an einem (höheren, linken) Teil der URI.
bearbeitet: Habe versucht, FileInfo hinzuzufügen, ohne Effekt. Das Beispiel wurde aktualisiert, um es vollständiger zu machen. Einstellungen Speicherort /cgi-bin/api/reports/customer1 Benutzer CUSTOMER1 erforderlich funktioniert in der Konfiguration einwandfrei, ich wollte nur vermeiden, dass bei jedem Ausführen der Jobs ein Neuladen des Webservers erforderlich ist und die .htaccess-AuthZ-Dateien neu erstellt werden, da einige der Jobs jede Minute ausgeführt werden und ich mir nicht die Mühe machen wollte, ein umfassenderes Tool zu erstellen, das httpd nur neu laden kann, wenn es wesentliche AuthZ-Änderungen gibt, da .htaccess theoretisch in der Lage sein sollte, Apache bei jedem Zugriff auf AuthZ-Änderungen zu prüfen, ohne dass privilegiertes Neuladen erforderlich ist.
Antwort1
Antwort nach erster Frage
<Directory>
Und<Location>
Richtlinien sind nicht zulässig innerhalb.htaccessDateien (sieheKontextAbschnitt).
Platzieren Sie einfach eine separate.htaccessDatei innerhalb der/foo/bar/berichte/Ordner, der die Anweisungen Auth*
und enthält Require
. Stellen Sie sicher, dass der Pfad zu Ihrem.htpasswdDatei ist gültig (absolute Pfade sind vorzuziehen).
Wenn es immer noch nicht funktioniert, überprüfen Sie, ob dieAllowOverride
-Richtlinie richtig gesetzt wurde (also innerhalb einer<Directory>
Richtlinie) im Rahmen dervirtueller Host/Serverkonfiguration(.confDatei innerhalb der/etc/apache2/Ordner).
Antwort nach der ersten Bearbeitung der Frage
A.htaccessDatei ist das Äquivalent einer <Directory>
Direktive innerhalb einer.confDatei. Im Moment mischen Sie <Directory>
und <Location>
Anweisungen zur Authentifizierung. Würden Sie bitte die <Location>
Anweisungen aus Ihrer.confDatei und ersetzen Sie Ihre <Directory>
Anweisungen durch die folgenden, während Sie die.htaccessDateien unberührt:
<Directory "/var/www/cgi-bin/">
Options ExecCGI
AuthType Basic
AuthName "App Server"
AuthUserFile /etc/httpd/conf.d/app.passwd
require valid-user
</Directory>
<Directory "/var/www/cgi-bin/api/">
AuthType Basic
AuthName "App API"
AuthUserFile /etc/httpd/conf.d/app-api.passwd
Require valid-user
LogLevel trace8
</Directory>
<Directory "/var/www/cgi-bin/api/reports/">
AllowOverride FileInfo AuthConfig
Options +Indexes +FollowSymLinks -ExecCGI
IndexOptions +NameWidth=*
SetHandler default-handler
LogLevel trace8
</Directory>
Bis Sie Ihre Frage bearbeitet haben, ging ich davon aus, dass die <Location>
Anweisungen in einem.htaccessDatei und würde auf virtuelle Ordner statt auf tatsächliche Dateisystemspeicherorte verweisen. AllerdingsHandbuch besagt ausdrücklich:
Es ist wichtig, dass Sie es niemals verwenden,
<Location>
wenn Sie versuchen, den Zugriff auf Objekte im Dateisystem einzuschränken. Dies liegt daran, dass viele verschiedene Webspace-Standorte (URLs) auf denselben Dateisystemstandort verweisen könnten, wodurch Ihre Einschränkungen umgangen werden könnten.
Antwort2
Dein AllowOverride Richtlinie fehlt.
Trotz der Dokumentation für die Erforderliche Richtlinie sagt, der Befehl sollte lauten:
AllowOverride FileInfo AuthConfig