Документация / Публикация из папки, отличной от public_html

Публикация из папки, отличной от 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.