“Символічне посилання заборонено або ціль посилання недоступна” / 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>

Ціль символічного посилання має дозволи, які повинні дозволити апачу читати все, що завгодно:

 [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 ЗАБОРОНЕНО, і це записано у /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 будуть стандартними. : зітхання:
Біллі ONeal

11
Я вважаю, що він мав на увазі + x у каталогах. Спробуйте переключитися на користувача та ввести в каталог w / o + x. З пам'яті + x дозволяє отримувати доступ, але не бачити каталог, тоді як + r дозволяє перераховувати файли, а + w дозволяє змінювати файли у вказаному каталозі

1
@BillyONeal: фраза "весь шлях" має на увазі каталоги.
bahamat

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, але це було не так.


6

Ця помилка також може бути викликана, якщо ви посилаєтесь на зашифровану папку.


4

Здається, що "FollowSymLinks" - це варіант, який вам потрібен у httpd.conf. Це докладно тут . Схоже, вам може знадобитися правило і в htdocs ... але це потрібний варіант.


3
Дивіться Options All- FollowSymLinksвже вказано.
Біллі ONeal

2

Ви також можете перевірити, чи застосовується selinux чи ні. У RedHat / Fedora виконайте це:

getenforce

Якщо відповідь "Насилення", ви можете виконати виконання

setenforce 0

і повторіть спробу URL у своєму браузері.

Зауважте, що я не кажу, що відключення selinux - це найкращий спосіб вирішити цю проблему, але це може допомогти визначити причину.


це вирішило проблему зв’язку sym, але чи є якісь негативні наслідки?
digz6666

2
Options +FollowSymLinks

Створіть .htaccess файл із цим зробив для мене трюк (покладіть його в dir перед символьним посиланням).


У моєму випадку я робив /var/wwwсимволічне посилання на інше проміжне символічне посилання. Якщо вам потрібно використовувати символічні посилання, зробіть це символічним посиланням Прямо до місця призначення.
Шрідхар Сарнобат

0

що вирішити мою проблему після дозволу всіх дозволів і дозволити followymlink "У випадку FollowSymLinks конкретно це ОБОВ'ЯЗКОВО бути в структурі каталогу, якщо у файлі .conf. З поточного керівництва Apache"

Параметри FollowSymLinks та SymLinksIfOwnerMatch працюють лише у розділах або .htaccess-файлах.

відповідь звідси


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

З деякою акребатією груп символів + користувачів у вас може бути розгорнуто кілька користувачів / версій.


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/

Виправлення негайно - не потрібно перезапускати апаш.


-1

Ви також можете скорегувати налаштування SELinux, і, можливо, не буде вашої сили. Тому спробуйте це:

sudo /usr/sbin/setenforce 0

і щоб це зберігалося між перезавантаженнями

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