Apache folgt keinen Symlinks (403 Verboten)


90

Ich habe Probleme beim Einrichten von Apache unter Ubuntu. Ich habe diesen Leitfaden befolgt .

# /usr/sbin/apache2 -v
Server version: Apache/2.2.17 (Ubuntu)
Server built:   Feb 22 2011 18:33:02

Mein öffentliches Verzeichnis / var / www kann darin platzierte PHP-Seiten erfolgreich bereitstellen und ausführen. Ich möchte jedoch in / var / www einen Symlink erstellen, der auf ein Verzeichnis in meinem Home-Ordner verweist und dort Seiten bereitstellt.

[root /var/www]# ll
total 36
drwxr-xr-x  3 root root 4096 2011-09-11 14:22 .
drwxr-xr-x 14 root root 4096 2011-06-04 22:49 ..
lrwxrwxrwx  1 root root   16 2011-09-11 13:21 about -> /root/site/about

Wenn ich versuche, über den Browser auf / about zuzugreifen, bekomme ich

Forbidden

You don't have permission to access /about on this server.

Soweit ich weiß, habe ich den Dateien, die ich bereitstellen möchte, ausreichende Berechtigungen erteilt:

[root ~/site/about]# ll
total 24
drwxr-xr-x 5 root root 4096 2011-09-11 13:20 .
drwxr--r-- 3 root root 4096 2011-09-11 13:19 ..
drwxr-xr-x 2 root root 4096 2011-09-11 13:21 contact
-rwxr-xr-x 1 root root 1090 2011-09-11 13:19 index.php
drwxr-xr-x 2 root root 4096 2011-09-11 13:20 me
drwxr-xr-x 2 root root 4096 2011-09-11 13:21 resume

Mir ist die Option FollowSymLinks bekannt, und ich glaube, sie ist in meiner Datei / etc / apache2 / sites-enabled / 000-default festgelegt:

DocumentRoot /var/www
<Directory />
    Options FollowSymLinks
    AllowOverride None
</Directory>
<Directory /var/www/>
    Options FollowSymLinks Indexes MultiViews
    AllowOverride None
    Order allow,deny
    allow from all
</Directory>

Irgendeine Idee, was mir fehlen könnte?

Antworten:


126

Überprüfen Sie, ob Apache für Ausführungsrechte hat /root, /root/siteund /root/site/about.

Lauf:

chmod o+x /root /root/site /root/site/about

8
Vielen Dank ... Ich wusste nicht, dass die übergeordneten Verzeichnisse auch ausführbar sein müssen.
Tim

39
Nun, ich sage nicht, dass es nicht funktionieren wird, aber im Allgemeinen ist es keine gute Idee, o + x on / root zu geben;)
Michal Rzemieniecki

11
Michal hat recht. Ich habe festgestellt, dass ich ACLs verwenden kann (zumindest in Mac) : chmod -R +a "_www allow list,search,readattr" /root /root/site /root/site/about, die diese Berechtigungen nur für die Apache-App (_www) erteilen, die etwas sicherer als "andere" ist.
James S

1
Unter Mac OS (10.9.4) hatten meine ~ / Dokumente keine Ausführungsrechte und ich hatte ein Git-Repo, in dem meine Site-Dateien gehostet wurden. Chmod o + x auf ~ / Documents zu gewähren hat den Trick gemacht! Vielen Dank!
Ernani Joppert

1
Endlich die Antwort! Vielen Dank.
whoan

21

Der 403-Fehler kann auch durch ein verschlüsseltes Dateisystem verursacht werden, z. B. einen Symlink zu einem verschlüsselten Basisordner .

Wenn Ihr Symlink auf den verschlüsselten Ordner verweist, kann der Apache-Benutzer (z. B. www-data) nicht auf den Inhalt zugreifen, selbst wenn die Berechtigungen für Apache und Datei / Ordner korrekt festgelegt sind. Der Zugriff des WWW- Datenbenutzers kann mit einem solchen Aufruf getestet werden:

sudo -u www-data ls -l /var/www/html/<your symlink>/

Es gibt Abhilfen / Lösungen für diese, zum Beispiel Hinzufügen der www-data Benutzer zu Ihrem privaten Gruppe (macht die verschlüsselten Daten an den Web - Benutzer) oder durch eine unverschlüsselte rsynced Ordner einrichten (wahrscheinlich eher sichern). Ich selbst werde mich wahrscheinlich während der Entwicklung für eine Rsync-Lösung entscheiden.

/ubuntu/633625/public-folder-in-an-encrypted-home-directory

Ein praktisches Werkzeug für meine Zwecke ist lsyncd . Auf diese Weise kann ich direkt in meinem verschlüsselten Home-Ordner arbeiten und Änderungen fast sofort auf der Apache-Webseite sehen. Die Synchronisation wird durch Änderungen im Dateisystem ausgelöst, die einen rsync aufrufen. Da ich nur an eher kleinen Webseiten und Skripten arbeite, ist die Synchronisierung sehr schnell. Ich habe mich für eine kurze Verzögerung von 1 Sekunde entschieden, bevor der rsync gestartet wird, obwohl es möglich ist, eine Verzögerung von 0 Sekunden einzustellen .

Installation von lsyncd (in Ubuntu):

sudo apt-get install lsyncd

Starten des Hintergrunddienstes:

lsyncd -delay 1 -rsync /home/<me>/<work folder>/ /var/www/html/<web folder>/

3
Dies sudo -u www-data ...ist eine großartige Möglichkeit, um zu überprüfen, ob ein Berechtigungsproblem vorliegt! Beachten Sie, dass der Benutzer je nach Distribution WWW-Daten, Apache oder etwas anderes sein kann.
Mkasberg

Arghh, endlich! Ich habe bereits an meinen grundlegendsten Fähigkeiten gezweifelt!
Kalabalik

Verlorene Stunden dafür und es war am Ende Verschlüsselung!
Myol

15

Ich hatte ein ähnliches Problem, das ich auf meinem neuen Server lange Zeit nicht lösen konnte. Neben der Antwort von palacsint lautet eine gute Frage: Verwenden Sie Apache 2.4? In Apache 2.4 gibt es einen anderen Mechanismus zum Festlegen der Berechtigungen, die bei Verwendung der obigen Konfiguration nicht funktionieren. Daher habe ich die in diesem Blogbeitrag erläuterte Lösung verwendet .

Grundsätzlich musste ich meine Konfigurationsdatei konvertieren von:

Alias /demo /usr/demo/html

<Directory "/usr/demo/html">
    Options FollowSymLinks
    AllowOverride None
    Order allow,deny
    allow from all

</Directory>

zu:

Alias /demo /usr/demo/html

<Directory "/usr/demo/html">
    Options FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>

Beachten Sie, wie die Zeilen " Bestellen" und " Zulassen" durch "Alle gewährt" ersetzt wurden


Beachten Sie, dass die Befehle Order / Allow / Deny auf den meisten Computern weiterhin verfügbar sind. In neueren Versionen ist es im access_compatModul implementiert . Wenn dieses Modul aktiviert ist, funktioniert der erste Teil wahrscheinlich nicht wie erwartet. Wenn es nicht vorhanden ist, sollte der Versuch, Apache2 zu starten, mit Fehlern fehlschlagen.
Alexis Wilke

Welche Konfiguration? Das /etc/httpd/conf/httpd.confexistiert auf meinem System nicht und das Verzeichnis /etc/httpd/existiert auch nicht.
Aaron Franke

@AaronFranke Hast du Apache installiert? Könnte hier sein: /etc/apache2/httpd.conf /etc/apache2/apache2.conf /etc/httpd/httpd.conf /etc/httpd/conf/httpd.conf
RightHandedMonkey

Ja, ich habe Apache installiert und bin auf Ubuntu. /etc/apache2/apache2.confexistiert für mich.
Aaron Franke

7

Im Zusammenhang mit dieser Frage habe ich gerade herausgefunden, warum mein vhost mir diese 403 gab.

Ich hatte ALLE Möglichkeiten zu dieser und anderen Fragen ohne Glück getestet. Es macht mich fast verrückt.

Ich richte einen Server mit einer Release-Bereitstellung ein, die Capistrano ähnelt, und zwar über Symlinks. Als ich versuchte, auf den DocRoot-Ordner zuzugreifen (der jetzt ein Symlink zum aktuellen Release-Ordner ist), erhielt ich den 403.

Mein vhost ist:

DocumentRoot /var/www/site.com/html
<Directory /var/www/site.com/html>
        AllowOverride All
        Options +FollowSymLinks
        Require all granted
</Directory>

und meine Hauptdatei httpd.conf war (Standardinstallation von Apache 2.4):

DocumentRoot "/var/www"
<Directory "/var/www">
    Options -Indexes -FollowSymLinks -Includes
(...)

Es stellt sich heraus, dass die Hauptdefinition der Optionen Vorrang vor meinem vhosts-Feld hatte (für mich ist das nicht intuitiv). Also habe ich es geändert in:

DocumentRoot "/var/www"
<Directory "/var/www">
    Options -Indexes +FollowSymLinks -Includes
(...)

und Eureka! (Beachten Sie das Pluszeichen vor FollowSymLinks in der Datei MAIN httpd.conf. Ich hoffe, dies hilft einer anderen verlorenen Seele.


In Apache 2.4 macht Ihre Lösung die Konfiguration ungültig und httpd kann nicht gestartet werden, da Sie '+' und '-' nicht in einer einzigen Optionszeile kombinieren können.
Deesto

Ja, das war es, obwohl ich einen DocumentRoot "früher" in der Datei deklariert hatte, wurde der
untergeordnete

2

Es gibt eine andere Möglichkeit, dass symbolische Links versagen, wie ich in meiner Situation festgestellt habe. Wenn Sie ein SELinux-System als Server haben und die symbolischen Links auf einen NFS-gemounteten Ordner verweisen (andere Dateisysteme können ähnliche Symptome hervorrufen),httpd möglicherweise die falschen Kontexte und lehnen es ab, den Inhalt der Zielordner bereitzustellen.

In meinem Fall ist der SELinux-Kontext von /var/www/html(den Sie erhalten können ls -Z) unconfined_u:object_r:httpd_sys_content_t:s0. Die symbolischen Links in /var/www/htmlhaben denselben Kontext, aber der Kontext ihres Ziels, der ein NFS-gemounteter Ordner ist, istsystem_u:object_r:nfs_t:s0 .

Die Lösung besteht darin fscontext=unconfined_u:object_r:httpd_sys_content_t:s0, die mountOptionen zu erweitern (z # mount -t nfs -o v3,fscontext=unconfined_u:object_r:httpd_sys_content_t:s0 <IP address>:/<server path> /<mount point>. B. ). rootcontextist irrelevant und defcontextwird von NFS abgelehnt. Ich habe es nicht contextalleine versucht .


2

Deaktivieren Sie zuerst Selinux (vim / etc / selinux / config)

vim /etc/httpd/conf/httpd.conf Bearbeiten Sie die folgenden Zeilen für Symlinks und Verzeichnisindizierung:

documentroot /var/www/html
<directory /var/www/html>
    Options Indexes FollowSymLinks
    AllowOverride None
</directory>

Wenn .htaccess-Datei, dann AllowOverride all


Was ist, wenn ich den /etc/httpd/Ordner nicht auf meinem System habe?
Aaron Franke


1

Zusätzlich zum Ändern der Berechtigungen, wie in den anderen Antworten angegeben, musste ich Apache neu starten, damit es wirksam wird:

sudo service apache2 restart

0

Noch eine subtile Falle, falls Sie brauchen AllowOverride All:

Irgendwo tief im fs-Baum ein alter .htaccess Wesen

    Options Indexes

anstatt

    Options +Indexes

war alles, was nötig war, um das FollowSymLinksSet in der Serverkonfiguration lässig zu deaktivieren und hier eine mysteriöse 403 zu verursachen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.