«Символическая ссылка не разрешена или цель ссылки недоступна» / Apache на CentOS 6

30

У меня есть совершенно новая установка CentOS 6, которая содержит символическую ссылку в корне документа на мои файлы разработки:

[root@localhost html]# ls -l
total 4
-rwxrwxrwx. 1 root root  0 Sep 18 20:16 index.html
-rwxrwxrwx. 1 root root 17 Sep 18 20:16 index.php
lrwxrwxrwx. 1 root root 24 Sep 18 20:19 refresh-app -> /home/billy/refresh-app/

Мой httpd.conf имеет это:

<Directory "/">
    Options All
    AllowOverride None
    Order allow,deny
    Allow from all
</directory>

Цель символической ссылки имеет разрешения, которые должны позволить apache читать все, что он хочет:

 [root@localhost billy]# ls -l
total 40 (Some entries were omitted because the list was too long
drwxr-xr-x. 7 billy billy 4096 Sep 18 20:03 refresh-app

Я также попытался отключить SELinux, изменив /etc/selinux/conf:

SELINUX=disabled

Тем не менее, независимо от того, что я делаю, когда кто-то пытается перейти по этой ссылке http://localhost/refresh-app/, я получаю страницу ошибки 403 FORBIDDEN, и это написано в /var/log/httpd/error_log:

Symbolic link not allowed or link target not accessible

Почему Apache не может получить доступ к цели символической ссылки?

Билли ОНил
источник
На каком пользователе работает Apache? Можете ли вы прочитать этот ресурс как этот пользователь?
draeath
Кроме того, вам лучше запустить selinux в разрешающем режиме, а затем использовать sealert для анализа журнала аудита - это позволяет понять, почему / как SELinux это отрицает и часто даже дает вам разрешение.
draeath
@draeath: я понятия не имею, как это проверить.
Билли ONEAL
@draeath: 1. Это не производственная коробка; Мне все равно, выключен ли SELinux. 2. В любом случае, я просто устраняю неполадки на этом этапе - я, вероятно, восстановлю их, как только выясню причину.
Билли ONEAL
Не волнуйтесь, это обычный недосмотр, когда я впервые сделал это, я застрял на несколько дней, serverfault.com/questions/313485/… :: Это одна из тех ошибок. : D
whoami

Ответы:

44

Нашел проблему. Оказывается, Apache хочет получить доступ к не только каталогу , я служащая, /home/billy/refresh-app/, но и каждый каталог выше , что, в частности /home/billy/, /homeи /. (Я понятия не имею, почему ... предоставление кому-либо доступа к подкаталогу не должно требовать передачи разрешений на все, что находится над этим подкаталогом ....)

Я предполагаю, что он ищет .htaccessили что-то в этом роде, или, возможно, * nix странно относится к тому, как он обрабатывает разрешения для трансформации каталога.

Билли ОНил
источник
15
Это не странно. Вот как это работает. Вы должны иметь + x для всего пути, к которому вы пытаетесь получить доступ.
Багамат
4
@bahamat: Это не имеет никакого смысла. Зачем кому-то нужны права на выполнение файлов, которые не выполняются? (Это полностью исключает необходимость отдавать права /... почти всегда). Системы с ACL обычно имеют отдельную опцию поперечного каталога. Можно подумать, что через 30 лет после разработки Unix и широкой доступности систем ACL списки ACL станут стандартом. : sigh:
Билли ОНил
11
Я считаю, что он имел в виду + ​​х на каталогах. Попробуйте переключиться на пользователя и перейти в каталог w / o + x. Из памяти + x позволяет получить доступ, но не видеть каталог, в то время как + r позволяет перечислять файлы, а + w позволяет изменять файлы в указанном каталоге
1
@BillyONeal: фраза «весь путь» подразумевает каталоги.
Багамат
5
Это правильное поведение в Unix. Вам нужны права на выполнение (+ x для g или o) в родительских каталогах, которые вы пытаетесь преобразовать в подкаталоги под ними.
SLM
11

У меня была похожая проблема, когда у меня была следующая конфигурация, которая раньше работала с Ubuntu 10, но перестала работать с Ubuntu 14 (Apache 2.4):

<Directory /var/www/vhosts/example.com/httpdocs>
    Options +FollowSymLinks
</Directory>

Переход к этому разрешил проблему (хотя пользователь веб-сервера не смог получить прямой доступ к символической ссылке)

<Directory /var/www/vhosts/example.com/httpdocs>
    Options +ExecCGI +FollowSymlinks -SymLinksIfOwnerMatch
</Directory>

Из того, что я могу сказать, это просто -SymLinksIfOwnerMatchнастройка и имеет какое-то отношение к изменениям в Apache 2.4, но я не пытался исследовать точную причину.

Я также думал, что это может быть связано с openbase_dirограничениями в PHP, но это не так.

icc97
источник
6

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

cherrysoft
источник
4

Похоже, что «FollowSymLinks» - это опция, которая вам нужна в httpd.conf. Это подробно здесь . Похоже, что вам может понадобиться правило и в htdocs ... но вам нужен этот вариант.

RobotHumans
источник
3
Смотрите Options All- FollowSymLinksуже указано.
Билли ONEAL
2

Вы также можете проверить, применяется ли selinux или нет. На RedHat / Fedora выполните это:

getenforce

Если ответ «Принудительный», вы можете выполнить

setenforce 0

и попробуйте еще раз URL в вашем браузере.

Обратите внимание, что я не говорю, что отключение selinux - лучший способ решить эту проблему, но это может помочь определить причину.

botkop
источник
это решило проблему с символьной ссылкой, но есть ли какие-либо негативные последствия
digz6666
2
Options +FollowSymLinks

Создание файла .htaccess с этим помогло мне (поместите его в каталог перед символической ссылкой).

Codebeat
источник
В моем случае я делал /var/wwwсимволическую ссылку на другую промежуточную символическую ссылку. Если вы должны использовать символические ссылки, сделайте это символической ссылкой ПРЯМО к месту назначения.
Шридхар Сарнобат
0

то, что решает мою проблему после того, как разрешить все разрешения и разрешить followsymlink "В случае FollowSymLinks, в частности, он ДОЛЖЕН быть внутри структуры Справочника, когда находится внутри файла .conf. Из текущего руководства Apache

Параметры FollowSymLinks и SymLinksIfOwnerMatch работают только в разделах или файлах .htaccess.

ответ отсюда

yoni333
источник
0

Моим решением было создать общую папку для всех именованных репозиториев /home/repo.

Тогда символическая ссылка из моего собственного дома, как: ln -s /home/repo ~/Code так ~/Code/www.xxxx.com/public указывает на /home/repo/www.xxxx.com/public

а также ссылка на веб-корень Apache /var/www/html указывает на /home/repo/www.xxxx.com/public

Нашел его здесь: https://github.com/alghanmi/ubuntu-desktop_setup/wiki/Git-Local-Repository-Setup-Guide

С некоторыми символическими ссылками + группа пользователей acrobacy вы можете развернуть несколько пользователей / версий.

Алло Мальбарез
источник
0

@Billey ONeil @Flion Я не мог ответить в строке (низкое количество повторений)
Вот что мне нужно было сделать:
( примечание: alias ll = 'ls $ LS_OPTIONS -lh')

root@Bellach:/var/www/html# ll lego
lrwxrwxrwx 1 root root 43 Sep 10 21:21 lego -> /home/DATA/Documents/Chris/Synced/web/lego/

Теперь посмотрите на каждый каталог в исходной ссылке

root@Bellach:/var/www/html# ll -d /home/DATA/Documents/Chris/Synced/web/
drwxr-xr-x 9 chris chris 4.0K Sep 12  2017 /home/DATA/Documents/Chris/Synced/web/
root@Bellach:/var/www/html# ll -d /home/DATA/Documents/Chris/Synced/
drwxr-xr-x 20 chris chris 4.0K Mar 27 18:52 /home/DATA/Documents/Chris/Synced/
root@Bellach:/var/www/html# ll -d /home/DATA/Documents/Chris/
drwxr-xr-x 36 chris chris 4.0K Jun 17 23:31 /home/DATA/Documents/Chris/
root@Bellach:/var/www/html# ll -d /home/DATA/Documents/
drwxr-xr-x 21 chris chris 4.0K Aug  7 18:22 /home/DATA/Documents/
root@Bellach:/var/www/html# ll -d /home/DATA/
drwxrwxr-- 10 root users 4.0K Sep 10 11:17 /home/DATA/
root@Bellach:/var/www/html# ll -d /home/
drwxr-xr-x 5 root root 4.0K Sep 10 10:37 /home/

Каталог / home / DATA является виновником.
Исправьте это с помощью этого:

root@Bellach:/var/www/html# chmod +x /home/DATA/
root@Bellach:/var/www/html# ll -d /home/DATA/
drwxrwxr-x 10 root users 4.0K Sep 10 11:17 /home/DATA/

Исправление немедленно - нет необходимости перезапускать Apache.

ausinch
источник
-1

Вы также можете изменить настройки SELinux, и setenforce может не оказаться на вашем пути. Так что попробуйте это:

sudo /usr/sbin/setenforce 0

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

sudo vi /etc/sysconfig/selinux
Рами Джамур
источник