Як виправити 403 у вбудованому Apache Mac OS X?


25

Я намагаюся встановити локальне середовище на моєму новому MacBook Air 13 ": вбудований Apache з моїми власними DocumentRoot, PHP та MySQL. Я зазвичай оновлюю /etc/hostsлише для запуску своїх локальних веб-сайтів досить постійну посилання:. local/exampleДля довідок я зазвичай чек:

На цей раз я просто отримую 403 забороненій помилку кожен раз , коли я вдарив 127.0.0.1, localhostабо local. Спочатку я побачив через термінал, що працюють і Apache, і PHP (хоча я не можу переглядати сторінки PHP); потім я оновив усі дозволи відповідно до дозволів Apache ; тепер я просто відчайдушний. Ось відповідні конфігурації Apache:

Схоже, Apache якось забороняє мені доступ до свого DocumentRoot(що, до речі, є ~/Sites). Оскільки ~/Sitesце насправді симпосилання, я намагався оновити DocumentRootнаступними шляхами (усі вказували на той самий каталог):

  • ~/Sites
  • /Users/joao/Sites
  • /Users/joao/Dropbox/Workflow/Sites( оригінальний каталог)

Ще кидають 403 . Будь-які ідеї, як це виправити / налагодити?

Швидке оновлення - ось як /var/log/apache2/joao.pt-error_logвиглядає:

[Sun Jul 07 12:50:45 2013] [error] [client 127.0.0.1] (13)Permission denied: access to / denied
[Sun Jul 07 12:50:45 2013] [error] [client 127.0.0.1] (13)Permission denied: access to /favicon.ico denied
[Sun Jul 07 12:50:45 2013] [error] [client 127.0.0.1] (13)Permission denied: access to /favicon.ico denied
[Sun Jul 07 12:50:45 2013] [error] [client 127.0.0.1] (13)Permission denied: access to /favicon.ico denied
[Sun Jul 07 12:50:47 2013] [error] [client ::1] (13)Permission denied: access to / denied
[Sun Jul 07 12:50:47 2013] [error] [client ::1] (13)Permission denied: access to / denied
[Sun Jul 07 12:50:48 2013] [error] [client ::1] (13)Permission denied: access to /favicon.ico denied
[Sun Jul 07 12:50:48 2013] [error] [client ::1] (13)Permission denied: access to /favicon.ico denied

Відповіді:


19

У мене є псевдонім, вказаний на сервері OSX, який вказує на каталог користувачів. Я довго проводив chmodding та возився з користувачем _www, додаючи виконуючі права дозволу, рекурсивно, видаляючи макпорти та всілякі речі, намагаючись змусити це працювати. Поняття не маю, чому це не працює.

Врешті-решт, я просто встановив прапорець "спільна папка" у Finder для цієї папки, і вона працювала у вказаному домені, з активною функцією php, як я цього хотів. : / ... так що це було легко.


Це не працювало для мене. Я створив папку /Sites(у своїй кореневій /папці) і помістив туди свої файли, налаштувавши відповідно параметри псевдоніму та каталогу. Працював чудово.
jpenna

11

Я оновлюю до macOSS Sierra , версія 10.12

Я стикаюся з тим же питанням, я зробив дві речі, щоб правильно їх виправити. Слідом - мої підходи.

1) Перевірте файл " /private/etc/apache2/extra/httpd-userdir.conf ". Зміна

#Include /private/etc/apache2/users/*.conf

до

Include /private/etc/apache2/users/*.conf

2) ** І відредагуйте " /etc/apache2/httpd.conf"

змінити

Options FollowSymLinks Multiviews

до

Options FollowSymLinks Multiviews Indexes

нарешті, ваш кореневий документ буде виглядати наступним чином,

DocumentRoot "/Library/WebServer/Documents"
<Directory "/Library/WebServer/Documents">
Options FollowSymLinks Multiviews Indexes
MultiviewsMatch Any
AllowOverride All
Require all granted

3) Перезапустіть апаш

sudo apachectl restart

Незважаючи на те, що ви зіткнулися з проблемою, уважно перевірте, як налаштувати Apache в macOS Sierra 10.12


9

Я, як правило, це виправляю, встановлюючи користувача Apache для себе в локальних середовищах і на машинах, де єдиним користувачем, який використовує Apache, є я. В /private/etc/apache2/httpd.conf, встановіть Userна ім'я користувача з _www, наприклад:

User _www

->

User joao

А потім перезапустіть Apache:

$ sudo apachectl restart

Додаткові кроки:

  1. Якщо у вас є активні сеанси, вони дадуть помилки з дозволом, оскільки вони все ще належать _www. Власні їм:

    $ sudo chown joao: /var/tmp/sess_*
    

Наслідки:

Після цього Apache (і PHP та ін.) Запуститься як ви, і отримає дозвіл на читання / запис для всіх файлів, які ви читали / записували. Але оскільки це лише локальне середовище розробки, це не повинно бути проблемою, якщо у вас немає правил блокувати Apache у брандмауері та не пускати сумнівні файли, такі як розвідники файлів, оболонки, скрипти, які можуть містити вразливості під управлінням Apache; у такому випадку будь-хто, включаючи ваш публічний сусід Wi-Fi у кафе, може входити http://<your IP>та робити все, що ті сценарії дозволяють їм робити.

Насправді вам слід запобігти цьому незалежно від запущених сценаріїв або навіть якщо ви не встановите для себе користувача Apache, оскільки, ймовірно, не хочете, щоб випадкові сторонні люди могли бачити вміст вашого localhost.

Профілактика:

  1. Змусити Apache слухати лише localhost. Знову в httpd.conf:

    Listen 80
    

    ->

    Listen 127.0.0.1:80
    

    І знову перезапустіть Apache:

    $ sudo apachectl restart
    
  2. Вимкнути Apache у брандмауері програми (зауважте, що ви, можливо, вже відключили його, якщо натиснули, Denyякщо / коли його запитали під час першого запуску Apache):

    1. Відкрити System Preferences» Security & Privacy» Firewall.
    2. Клацніть піктограму блокування внизу зліва та введіть свій пароль, якщо потрібно.
    3. Увімкніть брандмауер, якщо він відключений.
    4. Клацніть Firewall Options.
    5. Натисніть +кнопку.
    6. Натисніть cmd ⌘+ ⇧ shift+ Gі введіть /usr/sbin/httpdі натисніть Add(Якщо httpdтам не відображається, ви можете шукати його в терміналі за допомогою which httpd)
    7. У списку натисніть httpdі виберіть Block incoming connections.
    8. Удар OK.
    9. Перезавантажте брандмауер:

      $ launchctl unload /System/Library/LaunchAgents/com.apple.alf.useragent.plist
      $ sudo launchctl unload /System/Library/LaunchDaemons/com.apple.alf.agent.plist
      $ launchctl load /System/Library/LaunchAgents/com.apple.alf.useragent.plist
      $ sudo launchctl load /System/Library/LaunchDaemons/com.apple.alf.agent.plist
      
  3. Обмежте PHP корінцем документа. В php.ini:

    open_basedir = /Users/joao/Sites/:/var/tmp/
    

    ( /var/tmp/для сеансів)

Використовуйте всі три рішення, щоб убезпечити себе у випадку, якщо одне з них з якихось причин вимкнеться.

- Зауважте, що оскільки моя активна мова на моїй машині не є англійською мовою правильно, формулювання може бути дещо іншою (параметри меню та формулювання можуть бути різними незалежно від мови в різних версіях OS X).

- Рядки, що починаються з того, що $потрібно вводити в командний рядок (Terminal або iTerm тощо), при цьому $видаляються.


5

Я просто вирішив свою проблему, встановивши дозволи не лише до DocumentRootкаталогу, але й до всіх його батьківських каталогів. Ось як я це зробив .

(13) Дозвіл відхилено

Помилка 13 вказує на проблему дозволів файлової системи. Тобто Apache було відмовлено у доступі до файлу чи каталогу через неправильні дозволи. Загалом це не означає проблеми у файлах конфігурації Apache.

Для обслуговування файлів Apache повинен мати належний дозвіл, наданий операційною системою для доступу до цих файлів. Зокрема, Користувач або Група, вказані в httpd.conf, повинні мати можливість читати всі файли, які будуть обслуговуватися, та шукати в каталозі, що містить ці файли, а також усі батьківські каталоги до кореня файлової системи.

Типові дозволи в unix-подібній системі для ресурсів, які не належать Користувачеві або Групі, вказані в httpd.conf, будуть 644 -rw-r - r-- для звичайних файлів і 755 drwxr-xrx для каталогів або CGI-скриптів. Вам також може знадобитися перевірити розширені дозволи (наприклад, дозволи SELinux) в операційних системах, які їх підтримують.

Якщо у вас працює 2.4, код помилки AH може дати вам більше інформації тут.

  • AH00132: дозволи файлів забороняють доступ до сервера
  • AH00035: в доступі відмовлено, оскільки в компоненті шляху відсутні приклади пошуку

Скажімо, ви отримали помилку відхиленого дозволу під час доступу до файлу /usr/local/apache2/htdocs/foo/bar.html у системі, схожій на unix.

Спочатку перевірте наявні дозволи на файл:

cd /usr/local/apache2/htdocs/foo
ls -l bar.htm

Виправте їх, якщо потрібно:

chmod 644 bar.html

Потім зробіть те ж саме для каталогу та кожного батьківського каталогу (/ usr / local / apache2 / htdocs / foo, / usr / local / apache2 / htdocs, / usr / local / apache2, / usr / local, / usr):

ls -la
chmod +x .
cd ..
# repeat up to the root

У деяких системах ім'я утиліти можна використовувати, щоб допомогти знайти проблеми з дозволами, перерахувавши дозволи до кожного компонента шляху:

namei -m /usr/local/apache2/htdocs/foo/bar.html Якщо у вашій системі немає namei, ви можете використовувати парсепат. Його можна отримати звідси.

Якщо всі стандартні дозволи є правильними, і ви все ще отримуєте помилку відхиленого дозволу, слід перевірити наявність розширених дозволів. Наприклад, ви можете скористатися командою setenforce 0, щоб вимкнути SELinux і перевірити, чи не усунулася проблема. Якщо так, то ls -alZ можна використовувати для перегляду дозволу SELinux та chcon для їх виправлення.

У рідкісних випадках це може бути викликано іншими проблемами, такими як проблема дозволу на файли в іншому місці вашого файла apache2.conf. Наприклад, директива WSGIScriptAlias ​​не відображає фактичний файл. Повідомлення про помилку може бути неточним щодо файлу, який не можна було прочитати.

НЕ встановлюйте файли чи каталоги в режим 777, навіть "просто для тестування", навіть якщо "це просто тестовий сервер". Мета тестового сервера - виправити речі в безпечному середовищі, а не відволікатися, роблячи це неправильно. Все, що вам скаже, це якщо проблема з файлами, які існують насправді.

Сценарії CGI

Хоча дозвіл сценарію CGI може виглядати правильно, фактичний бінарний файл, вказаний у шебанге, може не мати належних дозволів для запуску. (Або якийсь каталог на його шляху, зверніться до namei, як пояснено вище.)

(13) В дозволі відмовлено: проксі: HTTP: спроба підключення до 127.0.0.1:8080 (localhost) не вдалася

Ця помилка насправді не стосується дозволів на файли чи чогось подібного. Це насправді означає, що httpd було відмовлено в дозволі на з'єднання з цією IP-адресою та портом.

Найпоширенішою причиною цього є те, що SELinux не дозволяє httpd здійснювати мережеві з'єднання.

Щоб вирішити це, вам потрібно змінити булеве значення SELinux (яке автоматично зберігатиметься при перезавантаженнях). Ви також можете перезапустити httpd для скидання проксі-сервера, хоча це не обов'язково.

# setsebool -P httpd_can_network_connect 1


1
Чи могли б ви узагальнити основні моменти у своїй відповіді? Спасибі!
Метт

2
Надання доступу до всіх своїх батьківських каталогів було б величезним порушенням безпеки!
Джуліан Ф. Вайнерт

1
Ця відповідь не корисна. Обхід працює для машин / конфігурацій Linux. OSX має іншу структуру каталогів, спеціально для apache (розташована в / Бібліотека / WebServer), яке рішення не для OSx, як це робить apple.stackexchange.
Хуан

3

Наступні кроки працювали для мене на High Sierra під керуванням Apache 2.4

(На основі наступного чудового підручника: http://www.cgi101.com/book/connect/mac.html , оновлений додатковими кроками щодо відмінностей у версії)

  1. Перемістіть файл у:

    /Library/WebServer/CGI-Executables
    
  2. Переконайтеся, що файл має дозволи на виконання:

    ls -l  /Library/WebServer/CGI-Executables
    

    Якщо не використовується:

    chmod -x  /Library/WebServer/CGI-Executables/myfile.cgi
    
  3. Відменте наступні рядки в /etc/apache2/httpd.conf

    AddHandler cgi-script .cgi .pl
    
    AddType text/html .shtml
    AddOutputFilter INCLUDES .shtml
    
    LoadModule cgi_module libexec/apache2/mod_cgi.so
    
  4. Також змініть строфу Каталог "/ Бібліотека / WebServer / CGI-Executables" на:

    <Directory "/Library/WebServer/CGI-Executables">
     AllowOverride None
     Options ExecCGI
     Require all granted
    </Directory>
    
  5. Потім перезапустіть Apache:

    sudo apachectl -k restart
    

Практично з кожною новою версією macOS зміни втрачаються, і вам потрібно буде переробити роботу та навіть зробити різні кроки, щоб її виправити. Ваш найкращий друг - це журнали Apache, розташовані в / var / log / apache2 / (/ var / log / apache2 / error_log)


1
Не відповідь, а спостереження. Інструкція №1 вище: Перемістіть файл у: Який файл?
Пам

0

Я використовував ACL для встановлення дозволів, дотримуючись інструкцій у розділі " Як встановити дозволи на файли та каталоги для Apache на Mac OS X ", але все одно отримую:

[Wed Feb 12 15:43:51 2014] [error] [client ::1] (13)Permission denied: access to /trace/trace.php denied (filesystem path '/Library/WebServer/Documents/trace/trace.php') because search permissions are missing on a component of the path

Потім я прочитав " (13) дозвіл відхилено " (пов'язаний з відповіддю Жоао Рамоса ) і спробував додати "виконати" до ACL. Це спрацювало.


0

Перезавантажте комп'ютер! Це працювало для мене.

Але першим ділом я змінив користувач під апач до себе (від _www), оскільки це локальна середовище / тест. Тому в кінцевому рахунку це має щось спільне з дозволами.

Потім перезавантажте машину, як і Windows;).


0

ОП описує проблему, яка виникає під час спроби налаштування локального середовища веб-сервера на Mac, використовуючи Apache, PHP та MySQL, із користувацьким DocumentRoot та включає згадування про використання VirtualHost (vhost). ОП повідомляє про отримання 403 забороненої помилки під час доступу до localhost.

У статті на coollestguidesontheplanet описано, як налаштування віртуальних хостів в Apache викликає "втрату Localhost". Іншими словами, першопричиною проблеми ОП може бути неповне включення привидів.

"Після встановлення [віртуальних хостів] ви втрачаєте попередній корінь документа раніше в / Бібліотеці / WebServer / Документах або отримуєте доступ до браузера за адресою http: // localhost - ви отримуєте 403 Заборонену помилку."

У статті далі пояснюється, як виправити localhost у середовищі vhost.

Add these lines to file /etc/apache2/extra/httpd-vhosts.conf:

   <VirtualHost *:80> 
   ServerName localhost 
   DocumentRoot /Library/WebServer/Documents/ 
   </VirtualHost>

Він також пояснює, як виправити "права доступу до таких речей, як оновлення та автентифікацію", пов'язані з "використанням папки" Користувачі / Ім'я користувача / Сайти "для vhosts".

Instead of using the default UID _www, use your own User and Group.

In the terminal, enter command 

    id

Find your UID and GID. 
Update file httpd.conf
In section <IfModule unixd_module>
Change User and Group to your local UID and GID.

https://coolestguidesontheplanet.com/set-virtual-hosts-apache-mac-osx-10-10-yosemite/


Спасибі за вашу відповідь. :) На жаль, короткі відповіді, такі як ця, насправді не дають достатньо деталей чи контексту, щоб допомогти багатьом користувачам. Натомість, ви можете редагувати свою відповідь, щоб включити короткий зміст вмісту, до якого ви посилаєтесь? Це зробить вашу відповідь більш самодостатньою та допоможе зберегти її для інших користувачів у майбутньому.
Мономет

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