Apache не будет следовать символическим ссылкам (403 запрещено) - PullRequest
82 голосов
/ 12 сентября 2011

У меня проблемы с настройкой 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>

Есть идеи, чего мне не хватать?

Ответы [ 7 ]

121 голосов
/ 12 сентября 2011

Убедитесь, что Apache имеет права на выполнение для /root, /root/site и /root/site/about.

Выполнение:

chmod o+x /root /root/site /root/site/about
16 голосов
/ 19 августа 2016

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

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

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

Есть обходные пути / решения для этого, например, добавление пользователя www-data в вашу личную группу (предоставляет зашифрованные данные веб-пользователю) или настройку незашифрованной папки rsynced (возможно, довольно безопасной). Я для себя, вероятно, пойду на решение rsync во время разработки.

https://askubuntu.com/questions/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>/
11 голосов
/ 16 января 2015

У меня была похожая проблема, которую я долго не мог решить на моем новом сервере. В дополнение к ответу 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 и позволяют заменены на Требуется все предоставленные

6 голосов
/ 21 октября 2015

В связи с этим вопросом я только что выяснил, почему мой призрак дал мне эти 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 (для меня это противоречит интуиции). Поэтому я изменил это на:

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

и Эврика! (обратите внимание на знак плюс перед FollowSymLinks в главном файле httpd.conf. Надеюсь, что это поможет какой-то другой потерянной душе.

1 голос
/ 10 августа 2016

Сначала отключите 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

1 голос
/ 18 марта 2016

Есть еще один способ, которым символические ссылки могут вас подвести, как я обнаружил в моей ситуации. Если в качестве сервера используется система 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 сам по себе.

1 голос
/ 23 октября 2014

Для тех, у кого возникли проблемы после обновления до 14.04 https://askubuntu.com/questions/452042/why-is-my-apache-not-working-after-upgrading-to-ubuntu-14-04 как корень изменен до обновления = / var / www после обновления = / var / www / html

...