Apache не будет следовать символическим ссылкам (403 запрещено)

92

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

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

Тим
источник

Ответы:

129

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

Бегать:

chmod o+x /root /root/site /root/site/about
Palacsint
источник
8
Большое спасибо ... Я не понимал, что родительские каталоги также должны быть исполняемыми.
Тим
39
Ну, я не говорю, что это не сработает, но в целом давать o + x для / root - не лучшая идея;)
Михал Рземенецкий
11
Михал прав. Я обнаружил, что могу использовать ACL (по крайней мере, на Mac):, chmod -R +a "_www allow list,search,readattr" /root /root/site /root/site/aboutкоторый предоставляет эти разрешения только приложению apache (_www), что немного безопаснее, чем "другое".
Джеймс С.
1
В Mac OS (10.9.4) мои ~ / Documents не имели прав на выполнение, и у меня был репозиторий git, в котором размещались файлы моего сайта. Предоставление chmod o + x для ~ / Documents сделало свое дело! Благодарность!
Эрнани Джопперт
1
Наконец-то получил ответ! Спасибо.
whoan
22

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

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

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

Для этого есть обходные пути / решения, например, добавление пользователя www-data в вашу частную группу (предоставляет зашифрованные данные веб-пользователю) или путем создания незашифрованной 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>/
user3811904
источник
3
Это sudo -u www-data ...отличный способ проверить, есть ли проблема с разрешениями! Обратите внимание, что пользователем может быть www-data, apache или что-то еще в зависимости от вашего дистрибутива.
mkasberg
Ох, наконец-то! Я уже сомневался в своих самых элементарных способностях!
kalabalik
Потерянные часы на это, и в конце концов это было шифрование!
myol 04
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 были заменены на Require all grant.

RightHandedMonkey
источник
Обратите внимание, что команды 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

Что касается этого вопроса, я только что понял, почему мой vhost выдал мне этот 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. Надеюсь, это поможет какой-нибудь другой заблудшей душе.

мустанг
источник
В 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Сам по себе не пробовал .

Urhixidur
источник
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

nsn srinivas
источник
Что делать, если в /etc/httpd/моей системе нет папки?
Аарон Франке
1

В дополнение к изменению разрешений, как указано в других ответах, мне пришлось перезапустить apache, чтобы он вступил в силу:

sudo service apache2 restart
tmath
источник
0

Еще одна ловушка на случай, если вам понадобится AllowOverride All:

Где - то глубоко в дереве фс, старый , .htaccessимеющий

    Options Indexes

вместо того

    Options +Indexes

все, что потребовалось, чтобы небрежно отключить FollowSymLinksнабор в конфигурации сервера и вызвать здесь таинственный 403.

Sz.
источник
0

При включенной опции FollowSymLinks:

$ rg "FollowSymLinks" /etc/httpd/
/etc/httpd/conf/httpd.conf
269:    Options Indexes FollowSymLinks

вам нужно, чтобы все каталоги в символической ссылке выполнялись пользователем, который использует httpd.

поэтому для этого общего варианта использования:

cd /path/to/your/web
sudo ln -s $PWD /srv/http/

Вы можете проверить права владельца с помощью namei :

$ namei -m /srv/http/web
f: /srv/http/web
 drwxr-xr-x /
 drwxr-xr-x srv
 drwxr-xr-x http
 lrwxrwxrwx web -> /path/to/your/web
   drwxr-xr-x /
   drwxr-xr-x path
   drwx------ to
   drwxr-xr-x your
   drwxr-xr-x web

В моем случае toкаталог был исполняемым только для моего пользователя:

Разрешить выполнение другими, решить эту проблему:

chmod o+x /path/to

Смотрите, что неисполняемый каталог может быть другим, или вам нужно воздействовать на группы вместо других, это зависит от вашего случая.

Альфан
источник