Публикация из папки, отличной от public_html
По умолчанию домен публикует public_html в вашем домашнем каталоге.
Современные PHP-фреймворки устроены наоборот: приложение живёт в одной папке, и
только подпапка public/ внутри неё должна быть доступна из веба. Файл .env —
пароль базы данных, ключ приложения, платёжные учётные данные — намеренно
находится уровнем выше.
Если вместо этого вы публикуете весь проект, /.env становится URL-адресом,
который может запросить кто угодно. Выбор корня документов — это то, как вы этого
избегаете.
Задайте его
Домены → строка домена → Корень документов.
У вас спросят папку внутри вашего домашнего каталога, записанную относительно него:
app/public
а не /home/you/app/public. Оставьте пустым, чтобы вернуться к public_html.
Панель создаёт папку, если её ещё нет, переписывает конфигурацию веб-сервера и перезагружает её. Когда всё готово, она сообщает полный путь, который теперь публикует, и явно указывает, если ей пришлось создать папку.
Типичная структура после этого:
/home/you/
├── app/ <- the whole project: composer.json, .env, vendor/
│ └── public/ <- the only part served to the web
└── public_html/ <- the default, no longer used
Проверьте, что сработало
Загрузите сайт. Затем запросите файл, который вы защищали:
curl -sI https://yourdomain.com/.env
403 — это ответ, который вам нужен. 200 означает, что корень документов
всё ещё выше .env и изменение не вступило в силу — перезагрузите страницу
«Домены» и убедитесь, что в строке показана та папка, которую вы ввели.
У каких доменов это есть
- Основной домен, addon-домены и поддомены — у каждого свой корень документов и своя кнопка Корень документов.
- Припаркованные (алиас) домены — нет. Алиас всегда обслуживает ваш основной сайт, что и делает его алиасом. Панель так и говорит: «Припаркованный домен всегда обслуживает ваш основной сайт. Измените основной корень документов вместо этого или преобразуйте это в addon-домен.»
- Редиректы — нет. Редирект не обслуживает ничего своего.
Что панель отклоняет и почему
Значение проверяется до того, как достигнет чего-либо привилегированного, и проверяется снова на другой стороне. Отказы возвращаются сообщением на странице, и ничего не меняется.
| Вы ввели | Почему это отклонено |
|---|---|
/var/www/html, ~/app |
Путь должен быть относительно вашего дома. Абсолютные пути и ~ не принимаются. |
../../etc, app/../.. |
Имя папки не может начинаться с точки, что и делает .. невозможным. Ничто за пределами вашего дома недостижимо, по построению. |
.ssh, .git, .config |
То же правило. Публикация .ssh выложила бы ваши ключи в веб; публикация .git выложила бы туда историю вашего исходного кода. |
tmp |
Там живут файлы ваших PHP-сессий. Публиковать это — значит публиковать сессии ваших посетителей. |
logs, etc, mail, ssl, backups |
Используются панелью для вашего аккаунта. |
a/b/c/d/e |
Не более четырёх уровней в глубину. |
| что-либо длиннее 128 символов | Слишком длинно. |
Ещё одна проверка происходит на самом сервере: папка разрешается через любые
символические ссылки и проверяется заново. Символическая ссылка, ведущая за
пределы вашего дома, отклоняется, а не проходится, так что ln -s / ~/app не
превращается в обслуживаемую файловую систему.
Сертификаты
Делать нечего. Сертификат выпускается для домена, а не для папки, и корень документов, который вы задали, перечитывается в момент записи сертификата — так что менять его во время настройки HTTPS безопасно. Addon-домен, у которого уже есть HTTPS, его сохраняет.
Когда что-то выглядит неправильно
Сайт показывает список каталога или «index of /». В новой папке пока нет
index.php или index.html. Загрузите приложение или направьте корень
документов на папку, где такой файл есть.
403 на каждой странице, а не только на .env. Папка существует, но
веб-сервер не может в неё прочитать. Проверьте в файловом менеджере, что папка и
её родители принадлежат вашему аккаунту, особенно если вы поместили туда файлы
по SSH под другим пользователем.
404 на каждой странице, а минуту назад сайт работал. Перезагрузите страницу
«Домены» и прочитайте папку, показанную в строке. Опечатка публикуется в точности
как введена — панель создаёт папку, а не угадывает, так что обычная причина —
пустая новая папка. Верните значение к public_html или к правильной папке.
Каждая страница возвращает 500 с ошибкой фреймворка о недостающем ключе. Это
приложение, а не корень документов — до фреймворка доходит. Для Laravel это
обычно пустой APP_KEY.