Ich versuche, die Verzeichnisliste für einen Ordner außerhalb des Webstamms von einem anderen lokalen ext4-Mount aus zu aktivieren, der die Standardauthentifizierung verwendet, erhalte jedoch eine leere Liste und keine protokollierten Fehler. Was seltsam ist, ist, dass wenn ich den bekannten Speicherort einer Datei unter diesem Verzeichnis in meinem Browser ablege, die Datei einwandfrei heruntergeladen wird.
Hier ist meine example.conf
Datei:
<virtualhost *:80>
ServerAdmin [email protected]
ServerName example.com
ServerAlias www.example.com
DirectoryIndex index.php
DocumentRoot /var/www/example.com
<Directory />
Options FollowSymLinks
AllowOverride All
</Directory>
LogLevel warn
ErrorLog /var/apachelogs/error.log
CustomLog /var/apachelogs/access.log combined
Alias /blah2 "/blah1/blah2"
<Location /blah2>
Options +Indexes +MultiViews +FollowSymLinks
IndexOptions +FancyIndexing
</Location>
</virtualhost>
Und hier ist meine .htaccess
AuthType Basic
AuthName "Authentication Required"
AuthUserFile "/home/myusername/.htpasswd"
Require valid-user
Außerdem habe ich kommentiert die IndexIgnore
in/etc/apache2/mods-enabled/autoindex.conf
#IndexIgnore .??* *~ *# RCS CVS *,v *,t
Ich bin gelaufen chmod -R 755 /blah1/blah2
und chgrp -R www-data /blah1/blah2
und chmod a+x -R /blah1/blah2
. Der Ordnerbesitzer ist Mitglied von www-data. Wenn ich laufe, sudo usermod -a -G www-data myusername
kann ich alle Dateien und Ordner gut durchsuchen und lesen.
Bei einigen Tests funktioniert meine Konfiguration einwandfrei, wenn ich / blah1 / blah2 in mein Home-Verzeichnis verschiebe und den Alias ändere. Es hat etwas damit zu tun, dass es sich auf einem anderen Mount befindet, das mod_autoindex durcheinander bringt, obwohl Apache die Dateien selbst klar lesen kann. Das Entfernen der Authentifizierung hilft nicht. Mit LogLevel warn
bekomme ich keine protokollierten Fehler. Nachdem ich mein LogLevel in trace4 geändert habe, ist hier mein Fehlerprotokoll .
Hier ist die Mount Line von /etc/fstab
:
UUID=[theuuid] /blah1 ext4 rw,nosuid,nodev,errors=remount-ro 0 0
BEARBEITEN Letzte Anmerkung: Um zu bestätigen, dass www-Daten in meinen Ordner lesen und schreiben können, habe ich das folgende PHP-Skript erstellt:
<?php
mkdir ("testdir");
var_dump(scandir('.'));
?>
Das Ergebnis: Verzeichnis testdir wird mit dem Eigentümer www-data: www-data erstellt, und die Liste der Verzeichnisse und Dateien wird als Variable ausgegeben.
EDIT2 Ich habe die folgenden Befehle ausgeführt, um die Berechtigungen korrekt festzulegen :
chmod 755 /blah1/blah2
chmod 755 /blah1
find /blah1/blah2 -type d -exec chgrp www-data {} +
find /blah1/blah2 -type d -exec chmod o+rx {} +
find /blah1/blah2 -type d -exec chmod g+rwxs {} +
Immer noch das gleiche Ergebnis.
LogLevel debug
und anschließenden Überprüfung von Protokolldateien?<Directory /blah1/blah2>
statt zu verwenden<Location /blah2>
?Antworten:
Es gibt verschiedene Dinge, die in Ihrer Konfiguration geändert werden können. Um Ihnen zu helfen, stelle ich hier die folgende Anleitung zur Verfügung, die auf der Standardkonfiguration von Apache2 basiert.
Behandeln Sie die Dateisystemberechtigungen
Um die Dateien zugreifen, die Benutzer Apache
www-data
Bedürfnisse Berechtigungen für die Dateien lesen und schreib ausführen Berechtigungen für die Verzeichnisse, auch in dieser Nummer schreibAusführungsBerechtigungen für den gesamten Pfad. Wenn Sie keine besonderen Anforderungen haben, würde ich Ihnen empfehlen, die Berechtigungen der anderen Benutzer zu verwenden.Nehmen wir an, das Verzeichnis, das Sie über den Webserver indizieren möchten, heißt
bar
und befindet sich im Ausgangsverzeichnis des Benutzersfoo
. Standardmäßig hat er Verzeichnisse/home
und/home/foo
muss755
Berechtigungen haben. Das letzte Bit in der Oktal - Zahl bedeutet , dass alle anderen Benutzer Berechtigungen Lese ausführen haben (Inhalt rad Zugang) an den Innen Dateien .755
/home/foo
Erstellen wir also unser Verzeichnis
/home/foo/bar
und stellen wir sicher, dass es (und sein Pfad)r-x
Berechtigungen für die anderen Benutzer hat:Erstellen wir nun drei Testdateien und stellen sicher, dass sie Leseberechtigungen für die anderen Benutzer haben:
Um das
www-data
Schreiben von Inhalten zu ermöglichen ,/home/foo/bar
können Sie den Gruppenbesitz des Verzeichnisses ändern undrwxs
Gruppenberechtigungen hinzufügen ( weitere Details ):Testen Sie, indem Sie drei weitere leere Dateien erstellen:
Beschäftige dich mit der Apache-Konfiguration
In der Hauptkonfigurationsdatei
/etc/apache2/apache2.conf
ist der Zugriff auf das Stammverzeichnis aus Sicherheitsgründen standardmäßig/
eingeschränkt. Ich würde Ihnen empfehlen, diese Regeln nicht über die Konfiguration des virtuellen Hosts zu überschreiben und<Directory />
Tags (und die beigefügten Anweisungen) zu entfernen .Insbesondere wenn Sie einen Alias für ein Verzeichnis außerhalb Ihres Verzeichnisses erstellen
DocumentRoot
, müssen Sie möglicherweise explizit den Zugriff auf das Zielverzeichnis (Quell- Apache-Modul mod_alias ) zulassen .Erstellen wir zunächst eine
.htpasswd
Datei mit ausreichenden Berechtigungen ( erhöhen Sie die Sicherheit mithilfe von 2FA - S.6 ):Demnach sollte der relevante Teil Ihrer Konfigurationsdatei für den virtuellen Host ungefähr so aussehen:
Aktivieren Sie die entsprechenden Module und starten Sie Apache2 neu, um die neue Konfiguration anzuwenden:
Beispielergebnis
Aktualisieren:
Ich gehe davon aus, dass das Problem zum Berechtigungsproblem des Dateisystems gehört. Der wahrscheinlich einfachste Weg, dies zu lösen, besteht darin, das Zielverzeichnis innerhalb des DocumentRoot-Verzeichnisses zu mounten, indem
bindfs
Sie das in dieser Antwort beschriebene verwenden .Arbeitslösung:
Hier ist die endgültige Lösung: Geben Sie die Idee auf, dass Alias für meinen extern bereitgestellten Ordner ordnungsgemäß funktioniert, und befolgen Sie stattdessen die Problemumgehungsempfehlung von @ pa4080
bindfs
, um den Ordner in / blah2 im Webroot bereitzustellen. Es ist mir nicht gelungen, / etc / fsab dazu zu bringen, meine Bindung korrekt zu initialisieren, daher habe ich beschlossen, ein Init-Skript für die Aufgabe zu schreiben.Installieren Sie zuerst bindfs:
Als nächstes habe ich eine Skriptdatei erstellt
/var/www/scripts/blahbind.sh
, die beim Start ausgeführt werden soll:Dann geben Sie ihm die richtigen Berechtigungen:
Als nächstes habe ich ein Service-Skript erstellt:
Mit dem Inhalt:
Hinweis,
mydrive.mount
sollte durch das Laufwerk des/blah1/blah2
Ordners ersetzt werden. Holen Sie sich eine Liste der Reittiere mitsystemctl list-units --type=mount
.Stellen Sie sicher, dass das Dienstskript funktioniert, indem Sie es ausführen
Aktivieren Sie dann den Dienst beim Neustart mit:
Und dann, meine vereinfachte Lage Block, sans
Alias
inexample.com.conf
quelle
bindfs
Problemumgehung konnte ich alles richtig zum Laufen bringen. Für mich bedeutet dies, dass es sich überhaupt nicht um ein Berechtigungsproblem handelt.Apache benötigt Ausführungsrechte für alle Verzeichnisse, Ihren Fall
/blah1
und/blah2
. Wenn es auf ein Verzeichnis stößt, das keine Gruppenausführungsrechte für ein Verzeichnis hat, führt es die Auflistung nicht durch.Sie müssen wahrscheinlich Änderungen
/blah1
vornehmenwww-data
, um entweder öffentliche Ausführungsrechte zu haben, oder um eine Gruppe mit Gruppenausführungsrechten zu sein, z.g+x
quelle
Nehmen wir an, dass das Dokumentstammverzeichnis mit Ihrem Verzeichnis verknüpft ist. Jetzt müssen wir den Speicherort unseres Dokumentenstamms bestätigen. Wir werden die Dateien mit kopieren
rsync
. Der Inhalt wird auf dem Einhängepunkt abgelegt, anstatt ihn an einenhtml
Speicherort zu übertragen.Jetzt können wir die Konfiguration aktualisieren
Vergessen Sie nicht,
mod_rewrite
diese Dokumente zu aktivieren .Schließlich überprüfen wir die Syntax und starten Ihren Apache neu.
Hoffe das hilfreich.
quelle