Apache не буде слідувати за символічними посиланнями (403 заборонено)


90

У мене виникають проблеми з налаштуванням Apache на Ubuntu. Я дотримувався цього посібника .

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

Мій загальнодоступний каталог / var / www може успішно обслуговувати та виконувати розміщені в ньому сторінки PHP. Однак я хочу створити символічне посилання в / var / www, яке вказує на каталог у моїй домашній папці та обслуговує там сторінки.

[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

Коли я намагаюся отримати доступ / про браузер, я отримую

Forbidden

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

Наскільки мені відомо, я надав достатньо привілеїв файлам, які хочу обслуговувати:

[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

Мені відомо про опцію FollowSymLinks, і я вважаю, що вона встановлена ​​у моєму файлі / etc / apache2 / sites-enabled / 000-default:

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>

Будь-яка ідея, чого я міг би пропустити?

Відповіді:


126

Переконайтеся, що Apache має права на виконання /root, /root/siteта /root/site/about.

Виконати:

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

8
Велике спасибі ... Я не розумів, що батьківські каталоги також повинні бути виконуваними.
Тім

39
Ну, я не кажу, що це не спрацює, але загалом, додавати o + x на / root - це не гарна ідея;)
Міхал Ремєнецький

11
Міхал має рацію. Я виявив, що можу використовувати ACL (принаймні в Mac):, chmod -R +a "_www allow list,search,readattr" /root /root/site /root/site/aboutякий надає ці дозволи лише програмі apache (_www), яка є трохи безпечнішою, ніж "інші".
James S

1
У Mac OS (10.9.4) мій ~ / Documents не мав прав на виконання, і я мав репозиторій git, де він містив би файли мого сайту. Надання chmod o + x на ~ / Документи зробили свою справу! Дякую!
Ернані Джопперт

1
Нарешті отримав відповідь! Дякую.
курва

21

Помилка 403 також може бути викликана зашифрованою файловою системою, наприклад, символічним посиланням на зашифровану домашню папку .

Якщо ваше символічне посилання вказує на зашифровану папку, користувач apache (наприклад, www-data) не може отримати доступ до вмісту, навіть якщо дозволи на apache та файли / папки встановлені правильно. Доступ користувача www-даних можна перевірити за допомогою такого дзвінка:

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

Для цього існують обхідні шляхи / рішення, наприклад, додавання користувача www-даних до вашої приватної групи (відкриває зашифровані дані веб-користувачеві) або встановлення незашифрованої папки rsynced (можливо, досить безпечної). Я для себе, мабуть, піду на рішення rsync під час розробки.

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

Зручним інструментом для моїх цілей є lsyncd . Це дозволяє мені працювати безпосередньо в моїй зашифрованій домашній папці і мати можливість майже миттєво бачити зміни на веб-сторінці apache. Синхронізація ініціюється змінами у файловій системі, викликаючи rsync. Оскільки я працюю лише на досить невеликих веб-сторінках та сценаріях, синхронізація відбувається дуже швидко. Я вирішив використати невелику затримку в 1 секунду до запуску rsync, хоча можливо встановити затримку в 0 секунд .

Встановлення lsyncd (в Ubuntu):

sudo apt-get install lsyncd

Запуск фонової служби:

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

3
Це sudo -u www-data ...чудовий спосіб перевірити, чи є проблема з дозволами! Зверніть увагу, що користувачем можуть бути www-дані, apache або щось інше, залежно від вашого дистрибутива.
mkasberg

Арх, нарешті! Я вже сумнівався у своїх найосновніших здібностях!
kalabalik

На цьому втратили години, і це врешті-решт було шифруванням!
myol

15

У мене була подібна проблема, яку я довго не міг вирішити на своєму новому сервері. На додаток до відповіді palacsint, гарне запитання: чи використовуєте ви Apache 2.4? В Apache 2.4 існує інший механізм встановлення дозволів, які не працюють, коли виконуються за допомогою вищезазначеної конфігурації, тому я використав рішення, пояснене в цьому дописі в блозі .

В основному мені потрібно було перетворити конфігураційний файл із:

Alias /demo /usr/demo/html

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

</Directory>

до:

Alias /demo /usr/demo/html

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

Зверніть увагу , як замовлення і дозволяють лінії були замінені Вимагають все надано


Зауважте, що команди Order / Allow / Deny доступні на більшості комп’ютерів. У новіших версіях це реалізовано в access_compatмодулі. Якщо цей модуль увімкнено, перша частина навряд чи буде працювати належним чином. Якщо його там немає, тоді спроба запустити Apache2 повинна провалитися з помилками.
Alexis Wilke

Який конфігуратор? У /etc/httpd/conf/httpd.confмоїй системі не існує, а також каталог /etc/httpd/не існує.
Аарон Франке,

@AaronFranke У вас встановлений apache? Може бути тут: /etc/apache2/httpd.conf /etc/apache2/apache2.conf /etc/httpd/httpd.conf /etc/httpd/conf/httpd.conf
RightHandedMonkey

Так, у мене встановлений Apache, і я перебуваю на Ubuntu. /etc/apache2/apache2.confіснує для мене.
Аарон Франке,

7

Пов’язане з цим запитанням, я просто з’ясував, чому мій хост дав мені цей 403.

Я перевірив ВСІ можливості з цього питання та інші без удачі. Це майже зводить мене з розуму.

Я налаштовую сервер із розгортанням випусків, подібним до способу Capistrano, через символічні посилання, і коли я спробував отримати доступ до папки DocRoot (яка тепер є символічним посиланням до поточної папки випуску), він дав мені 403.

Мій vhost:

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

і моїм основним файлом httpd.conf був (установка Apache 2.4 за замовчуванням):

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

Виявляється, основне визначення параметрів мало перевагу над моїм vhosts fiel (для мене це протилежне інтуїтивно). Тож я змінив його на:

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

та Еврика! (зверніть увагу на знак плюс перед FollowSymLinks у ГОЛОВНОМ файлі httpd.conf. Сподіваюся, це допоможе іншим загубленим душам.


В Apache 2.4 ваше рішення призведе до недійсності конфігурації, і httpd не вдасться запустити, оскільки ви не можете поєднати '+' та '-' в одному рядку параметрів.
deesto

Так, це все, хоча я раніше оголосив DocumentRoot "раніше" у файлі, це перевизначає дочірній розділ каталогу (що?)
rogerdpack,

2

Як я виявив у своїй ситуації, існує ще один спосіб, через який символічні посилання можуть вам підвести. Якщо у вас на сервері система SELinux, а символічні посилання вказують на змонтовану NFS (інші файлові системи можуть мати подібні симптоми), вони httpdможуть бачити неправильний контекст і відмовлятись обслуговувати вміст цільових папок.

У моєму випадку контекст SELinux /var/www/html(який ви можете отримати за допомогою ls -Z) є unconfined_u:object_r:httpd_sys_content_t:s0. Символічні посилання в /var/www/htmlбудуть мати той самий контекст, але контекст їх цілі, будучи встановленою NFS-папкою, є system_u:object_r:nfs_t:s0.

Рішення полягає в додаванні fscontext=unconfined_u:object_r:httpd_sys_content_t:s0до mountопцій (наприклад # mount -t nfs -o v3,fscontext=unconfined_u:object_r:httpd_sys_content_t:s0 <IP address>:/<server path> /<mount point>). rootcontextне має значення та defcontextвідхиляється NFS. Я не намагався contextсам по собі.


2

Спочатку вимкніть selinux (vim / etc / selinux / config)

vim /etc/httpd/conf/httpd.conf відредагуйте такі рядки для символьних посилань та індексації каталогів:

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

Якщо файл .htaccess, то AllowOverride all


Що робити, якщо у мене немає /etc/httpd/папки в моїй системі?
Аарон Франке,


1

На додаток до зміни дозволів, як вказують інші відповіді, мені довелося перезапустити apache, щоб він набрав чинності:

sudo service apache2 restart

0

Ще одна тонка помилка, на випадок, якщо вам потрібно AllowOverride All:

Де - то глибоко в дереві ФС, старий , .htaccessщо має

    Options Indexes

замість

    Options +Indexes

було все, що потрібно, щоб недбало відключити FollowSymLinksнабір у конфігурації сервера, і викликати тут таємничий 403.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.