Виртуальный хостинг: как настроить домены, папки и редиректы

Виртуальный хостинг: как настроить домены, папки и редиректы

Настройка виртуального хостинга нужна, когда на одном сервере размещают несколько сайтов и хотят, чтобы каждый домен открывал свой контент, а URL вели себя предсказуемо. На практике это набор связок: DNS направляет домен на сервер, веб-сервер сопоставляет домен с нужной конфигурацией, а в пределах этой конфигурации вы задаёте папки (document root), правила доступа и редиректы. Хорошая настройка снижает количество ошибок вроде “открывается не тот сайт” и “редирект крутится по кругу”.

Ниже разберём типовую схему от DNS до правил редиректов и покажем примеры для Nginx и Apache. Будет упор на домены, папки и перенаправления, потому что именно эти части чаще всего ломаются при запуске нескольких сайтов.

Что такое виртуальный хостинг и какие компоненты участвуют

Виртуальный хостинг — это возможность обслуживать несколько сайтов на одном IP/сервере, различая их по имени домена (и иногда по порту). Главные элементы процесса такие:

  • DNS-запись домена указывает на IP сервера (A/AAAA) или на имя (CNAME).
  • В веб-сервере конфигурация виртуального хоста сопоставляет входящий запрос с нужным блоком по имени хоста.
  • Внутри виртуального хоста задаются корневые папки сайта, индексные файлы и правила обработки URL.
  • Редиректы приводят запросы к канонической форме URL (например, HTTP на HTTPS, www на non-www, старые пути на новые).

Интуитивно это похоже на “маршрутизацию”: сначала выбираем, какой сайт обслуживать, затем решаем, куда направить URL внутри выбранного сайта.

Подготовка доменов и DNS перед настройкой виртуального хостинга

Прежде чем править конфиги Nginx или Apache, проверьте базу: домен должен корректно указывать на сервер. Даже идеально написанный virtual host не поможет, если DNS ведёт не туда.

A/AAAA/CNAME и распространенные ошибки

Обычно используют такие записи:

  • A: домен → IPv4 адрес сервера.
  • AAAA: домен → IPv6 адрес сервера (если вы используете IPv6).
  • CNAME: поддомен → другое имя (часто для переноса управления), но не для корневого домена без специальных оговорок у провайдера.

Типичные ошибки при запуске виртуального хостинга:

  • В одном месте указали A-запись, а в другом сервер слушает только IPv6 (или наоборот).
  • Для домена настроили записи, но серверной стороны нет: нужные виртуальные хосты не определены, или слушаются не те порты.
  • TTL стоит слишком высоким, и вы долго ждёте изменения. Снижать TTL заранее имеет смысл только если вы планируете миграцию.
  • Поддомен настроили как CNAME, а ожидали, что будет A-запись, и забыли про то, что итоговый ответ зависит от цепочки DNS.

Проверить, что домен реально резолвится в нужный IP, можно с рабочего места или в инфраструктуре:

  • dig или nslookup для проверки резолва,
  • curl с указанием Host-заголовка, если нужно проверить веб-сервер до полного DNS-пропагации.

Планирование www и HTTPS: что считать каноническим URL

На этапе подготовки договоритесь о канонической форме URL. Выберите один вариант, который будет “правильным”:

  • HTTP или HTTPS (обычно только HTTPS),
  • www или без www.

После этого редиректы должны переводить все остальные варианты на канонические URL. Если этого не сделать, в индексации и кешах появятся дубликаты страниц, а пользователи будут видеть неожиданные формы адресов.

Ещё один момент: если у вас несколько доменов, которые должны открывать один сайт (например, example.com и www.example.com), виртуальный хостинг должен быть согласован по server_name (Nginx) или ServerName/ServerAlias (Apache). В противном случае “часть” доменов может попасть в дефолтный хост, где документрута нет или там другое содержимое.

Структура файлов на сервере: папки для сайтов и шаблоны

Чтобы настройка виртуального хостинга не превращалась в хаос, заранее определите структуру директорий. Главное правило: у каждого сайта должна быть предсказуемая корневая папка, а вспомогательные директории не должны пересекаться между сайтами.

document root и вложенные директории

Типовая структура для нескольких сайтов:

  • /var/www/
  • site1/
  • public/ (или просто root с index.html)
  • logs/ (иногда делают отдельные лог-папки, но чаще логи идут в системные)
  • shared/ (опционально)
  • site2/
  • public/
  • /etc/nginx/sites-available/ и /etc/nginx/sites-enabled/ (если используете схему с папками)
  • /etc/apache2/sites-available/ и /etc/apache2/sites-enabled/ (для Apache в стиле Debian-подобных систем)

Если вы используете фреймворк или SPA, документрута часто две:

  • папка, из которой отдаются статические файлы,
  • правила rewrites/try_files, чтобы приложение обрабатывало маршрутизацию.

Пример для Nginx, когда приложение — это публичная папка и все “не файлы” уходят на index.php: «`nginx server { server_name example.com www.example.com; root /var/www/site1/public; index index.php index.html;

location / { tryfiles $uri $uri/ /index.php?$querystring; } } «`

Для простых статических сайтов document root может быть “один-в-один”:

  • root указывает на папку с index.html,
  • index задаёт файл по умолчанию.

Права, владельцы и безопасная настройка папок

Обычно проблема не в конфиге, а в правах на файловой системе: Nginx/Apache не могут читать файлы или — хуже — доступны лишние директории.

Практика, которая помогает:

  • Владелец файлов сайта — пользователь, под которым вы деплоите (например, deploy), а чтение для веб-сервера должно быть доступно через группы.
  • Папки для записи (cache, storage, uploads) должны иметь отдельные права, но не “на всё сразу”.
  • Логи и временные файлы лучше хранить в местах, где права настроены осознанно.

Типичные ошибки:

  • Дали права 777 на все папки ради скорости и забыли.
  • Публичная папка не отделена от приватной (например, vendor/ или конфиги доступны из web).
  • Не настроены права на папку uploads, из-за чего редактирование контента начинает падать после деплоя.

Рекомендация по проверке перед запуском: после правок убедитесь, что процесс веб-сервера реально может читать нужные файлы. Если вы не знаете, под каким пользователем работает Nginx/Apache, посмотрите конфиги или системные службы.

Nginx: настройка виртуальных хостов по доменам

Nginx “разделяет” сайты через server block. Каждый такой блок описывает, какие домены он обслуживает, на каких портах и какие правила применяются.

server blocks и директива server_name

Минимальный каркас для виртуального хоста:

«`nginx server { listen 80; server_name example.com www.example.com;

root /var/www/site1/public; index index.html;

location / { try_files $uri $uri/ =404; } } «`

Что важно:

  • listen 80 и listen 443 должны соответствовать вашим реальным сценариям (HTTP и HTTPS).
  • server_name перечисляет домены, которые должны матчиться.
  • root и index задают, откуда отдавать файлы и какой файл использовать, если URL без имени ресурса.

Если домен не матчит ни под один server block, запрос уйдёт в “дефолтный” хост. Поэтому, когда вы добавляете новый виртуальный хост, убедитесь, что дефолтный блок не раскрывает чужой сайт.

root, index, try_files и поведение при запросах

Редиректы и маршрутизация часто упираются в то, как Nginx обрабатывает запросы “не как файл”. Два типичных сценария:

  • Статика:
  • try_files проверяет наличие файла/директории и возвращает 404, если ничего нет.
  • Приложение (PHP/фреймворк):
  • try_files отправляет на index.php (или другой front-контроллер), если запрошенного файла нет.

Пример с PHP обработчиком (упрощённо, без полной конфигурации fastcgi): «`nginx location / { tryfiles $uri $uri/ /index.php?$querystring; } location ~ \.php$ { include fastcgi_params; fastcgi_pass unix:/run/php/php-fpm.sock; fastcgiparam SCRIPTFILENAME $documentroot$fastcgiscript_name; } «`

Для SEO и каноничности важно, чтобы приложение отдавал корректные редиректы для URL с/без слэша, с нужными расширениями и т.п. Но базовая часть — чтобы Nginx не отдавал “не тот файл” и не создавал неожиданные 404.

Редирект внутри server block: быстрые сценарии

Редиректы на уровне Nginx обычно делаются директивами return или rewrite. Для простого HTTP→HTTPS часто используют отдельный server на 80 порту:

«`nginx server { listen 80; server_name example.com www.example.com;

return 301 https://$host$request_uri; } «`

Обратите внимание на $host: он сохраняет домен, с которым пришли запросы. Если вы хотите всегда приводить к non-www или наоборот, лучше использовать фиксированное имя.

Пример принудительного перехода на www: «`nginx server { listen 80; server_name example.com;

return 301 https://www.example.com$request_uri; } «`

И дальше отдельный server block на www обрабатывает HTTPS. Это снижает риск циклов редиректа и “перепутанных” схем.

Apache: настройка виртуального хостинга по доменам

В Apache виртуальные хосты задаются директивами VirtualHost. По сути, это аналог server block, но синтаксис и логика немного другие.

VirtualHost, DocumentRoot и ServerName/ServerAlias

Базовая заготовка для VirtualHost:

«`apache <VirtualHost *:80> ServerName example.com ServerAlias www.example.com

DocumentRoot /var/www/site1/public Directory /var/www/site1/public Require all granted </Directory>

DirectoryIndex index.html </VirtualHost> «`

Для HTTPS вы добавляете отдельный VirtualHost на 443 с сертификатами. Виртуальный хост может обслуживать несколько доменов через ServerAlias.

Важно предусмотреть два момента:

  • Если у вас несколько сайтов, дефолтный VirtualHost должен быть “пустым” или содержать безопасную заглушку, чтобы запросы на неизвестные домены не открывали лишнее.
  • Правила доступа для папок (Directory) должны соответствовать тому, что реально находится в DocumentRoot. Если папка недоступна, вы получите 403 даже при правильном DocumentRoot.

.htaccess vs конфиг: где удобнее управлять редиректами

В Apache часто используют .htaccess, чтобы включить rewrite правила без правки основного конфига. Но для виртуального хостинга и редиректов лучше держать правила в основном конфиге, если это возможно: так проще контролировать порядок и масштабировать систему.

Если всё же используете .htaccess, типичная структура включает:

  • включение mod_rewrite,
  • настройку RewriteEngine,
  • правила RewriteRule.

Но при большом количестве сайтов нагрузка от проверки .htaccess может стать заметной. В задачах “настройка редиректа для конкретного домена/папки” удобнее держать правило в VirtualHost или отдельном конфиг-файле, чем раскладывать по корням.

Редиректы в виртуальном хостинге: как делать правильно

Редиректы — самая “хрупкая” часть в теме доменов и папок. Ошибка в коде ответа или в условии может приводить к редирект-циклам или потере части URL при переходе.

HTTP→HTTPS и принудительное www/non-www

Начните с канонического URL. Обычно схема выглядит так:

  1. На порту 80 вы принимаете все запросы и делаете редирект на HTTPS.
  2. На HTTPS вы делаете приведение к нужному виду домена (www или без).

Для Nginx это обычно два server блока: один на 80, второй на 443 с действительным корнем сайта. Пример, когда канонический домен — www: «`nginx server { listen 80; server_name example.com www.example.com; return 301 https://www.example.com$request_uri; } «`

В HTTPS-блоке вы можете обслуживать только www или сразу оба, но редирект лучше делать на раннем этапе, чтобы исключить дубль логики.

Для Apache логика похожая: делаете 301 редирект в VirtualHost на 80. Если используете modrewrite, обычно перевод делается с корректным сохранением URI, например через переменную REQUESTURI.

Важно: код 301 закрепляет редирект “навсегда”, его кешируют клиенты и поисковые системы. Если вы ещё не уверены в каноническом домене, иногда выбирают 302/307 на период теста, но в долгую всё равно придётся зафиксировать окончательный вариант.

Редиректы по папкам и канонические URL

Когда сайт переезжает или меняет структуру, редиректы применяются не только к домену, но и к путям.

Пример: старый раздел /old/ нужно перенаправить на /new/ с сохранением хвоста. Для Nginx: «`nginx location /old/ { return 301 /new/$request_uri; } «`

Но тут легко ошибиться с дублированием слэшей и с тем, что именно попадает в $request_uri (включая полный путь с /old/). Более безопасный вариант — использовать захват в rewrite, если вы точно понимаете, какую часть нужно сохранить.

Пример с rewrite в Nginx (концептуально): «`nginx location ^~ /old/ { rewrite ^/old/(.*)$ /new/$1 permanent; } «`

В Apache аналогично делается через RewriteRule:

  • шаблон слева матчится на путь,
  • справа задаётся новый путь,
  • флаг permanent задаёт 301.

Типичные ошибки редиректов по папкам:

  • Потеря query string. Пользователь теряет фильтры и параметры.
  • Некорректное формирование нового пути из-за неверного захвата группы.
  • Цикл: /old/ редиректит на /new/, а где-то ещё /new/ редиректит обратно на /old/.

Чтобы избежать циклов, проверяйте редиректы в обоих направлениях и ищите правила по всему конфигу, а не только в одном файле.

Учет методов и кодов 301/302/307/308

Код ответа влияет не только на SEO, но и на поведение клиентов.

  • 301: постоянный редирект. Обычно используется для канонизации URL (HTTP→HTTPS, www/non-www, переезд разделов).
  • 302: временный редирект. Иногда применяют для теста или временных изменений.
  • 307/308: временный/постоянный редирект, при котором метод обычно сохраняется. Это важно для API или для случаев, где запрос не только GET.

Для сайтов “обычного” типа в большинстве кейсов подходит 301. Но если у вас есть формы, POST-эндпоинты или API, не забывайте про метод: неверный редирект может превратить POST в GET на стороне клиента.

Практический подход:

  • Если вы редиректите страницу (GET), можно использовать 301.
  • Если редиректите endpoint, где возможны другие методы, уточните правила и код ответа, чтобы не сломать поведение.

Пересечения доменов и папок: wildcard, subdomains, алиасы

Когда сайтов больше одного, рано или поздно появляются задачи вида:

  • “все поддомены должны вести в один шаблон”,
  • “корень один, но некоторые папки должны обслуживаться из другой директории”,
  • “некоторые пути нужно перенаправлять на внешний URL”.

Wildcard-серверы и исключения

Nginx поддерживает wildcard в server_name, например:

  • *.example.com для поддоменов,
  • но важно понимать приоритеты и матчи: конкретные имена обычно имеют приоритет над wildcard.

Пример: «`nginx server { listen 443 ssl; server_name *.example.com;

root /var/www/subdomains_site/public; index index.html; } «`

Если вы добавили wildcard, убедитесь, что у конкретных доменов есть свои более приоритетные server blocks. Иначе, например, app.example.com может попасть в “общий” блок, даже если вы ожидали отдельную конфигурацию.

В Apache wildcard обычно реализуют через соответствие ServerAlias, но поведение зависит от конкретной схемы конфигурирования и того, как Apache выбирает VirtualHost при совпадениях. По этой причине для сложных случаев лучше держать явные домены, а wildcard использовать только там, где вы действительно уверены.

Alias/Redirect и работа с несколькими корнями

Иногда внутри одного домена часть URL должна отдавать файлы из другой папки. В Nginx для этого есть alias и location-структура.

Пример: /downloads/ отдаёт файлы из отдельного каталога: «`nginx location /downloads/ { alias /data/downloads/; autoindex off; } «`

Если вы используете alias, учитывайте ключевой момент: alias заменяет именно префикс location, а root влияет иначе. Это частая причина “вылезло не то содержимое”.

Для редиректов внешних URL используйте return: «`nginx location /partners/ { return 302 https://external.example.com/; } «`

В Apache аналогичные сценарии решаются через Redirect или Alias (в зависимости от того, отдаёте файлы или делаете перенаправление). Главное — отделяйте физическую отдачу файлов от перенаправлений, чтобы не смешивать логику и не создавать неожиданные статусы.

Проверка, отладка и типичные проблемы

После того как вы собрали домены, папки и редиректы, начинаются проверки. Они должны быть системными: иначе вы ловите ошибки “вручную”, а это долго и ненадёжно.

тест конфигурации, журналы и curl

Для Nginx:

  • используйте команду проверки конфигурации (например, nginx -t),
  • затем перезапускайте или перезагружайте.

Для Apache:

  • проверяйте синтаксис конфигов (апач умеет проверку командой),
  • после чего делайте reload, чтобы не терять активные соединения.

Дальше проверка запросами:

  • curl -I для заголовков и кода редиректа,
  • curl -L, чтобы увидеть финальный URL,
  • тест с Host-заголовком, если DNS ещё не полностью обновился.

Пример проверки редиректа HTTP→HTTPS:

  • делаете запрос на http://example.com/some-path
  • смотрите, что приходит 301/302 и правильный Location
  • затем повторяете на https://…

Если вы видите 404 или отдачу “не того сайта”, почти всегда причина одна из трёх:

  • неправильный server_name (или ServerName/ServerAlias),
  • неверный root/DocumentRoot или document root не существует,
  • запрос попал в дефолтный хост из-за отсутствия матча.

типичные ошибки: неправильный порядок location и редирект-циклы

Редирект-циклы — главный страх. Они проявляются так:

  • браузер долго крутит “перенаправление на страницу”
  • curl показывает повторяющиеся Location с тем же набором URL

Чтобы найти причину:

  • проверьте правила на 301 для домена,
  • затем правила на www/non-www,
  • затем редиректы по папкам,
  • и только после этого — редиректы внутри приложения (если оно тоже редиректит).

Ещё несколько частых проблем:

  • Дублирование “перенаправляющих” правил: например, HTTP→HTTPS делается и на 80, и на 443 где-то в другом месте.
  • Неправильная обработка слэша: /path/ и /path отличаются, а редирект приводит к циклу при попытке “добавить слэш” и тут же “убрать слэш”.
  • Ошибка в location-порядке в Nginx: некоторые location с регулярными выражениями могут перехватывать запросы раньше, чем вы ожидаете. Поэтому старайтесь держать правила понятными: конкретные префиксы выше, сложные regex — осознанно.

Если редиректы критичны для SEO или логики приложения, фиксируйте их в одном месте, а не разбрасывайте по нескольким файлам и модулям.

Чек-лист перед запуском виртуального хостинга

Чтобы настройка виртуального хостинга по доменам, папкам и редиректам не “расползлась” после деплоя, перед включением продакшена пройдитесь по списку.

  • Проверка доменов и совпадений:
  • домены, которые должны открывать сайт, перечислены в server_name (Nginx) или ServerName/ServerAlias (Apache);
  • дефолтный хост не обслуживает чужой контент по ошибке.
  • Проверка папок:
  • root/DocumentRoot указывает на существующую папку;
  • права на чтение есть у пользователя веб-сервера;
  • index-страница настроена, и запрос без файла действительно отдаёт ожидаемый контент.
  • Проверка редиректов:
  • HTTP→HTTPS возвращает 301 и Location содержит верную схему и домен;
  • www/non-www приводится к выбранному каноническому варианту;
  • редиректы по папкам сохраняют query string при необходимости;
  • нет редирект-циклов: проверка curl -I и curl -L для нескольких типовых URL.
  • Проверка логики приложения (если есть):
  • правила try_files/rewrite не ломают маршрутизацию;
  • статические файлы отдаются напрямую, а не “через приложение”, если это критично для производительности.
  • Проверка поведения для поддоменов и wildcard:
  • wildcard не перехватывает исключения, где должны быть отдельные конфигурации;
  • алиасы не указывают на неверные директории из-за путаницы root/alias.
  • Финальная валидация:
  • команда проверки конфигурации для Nginx/Apache проходит без ошибок;
  • после reload/restart сайт открывается по каноническому URL и отдаёт корректные коды статусов.

Итог: как собрать надёжную настройку доменов, папок и редиректов

Надёжная настройка виртуального хостинга держится на трёх принципах. Первый: домен должен однозначно матчиться с нужным виртуальным хостом. Второй: документрута и папки сайта должны быть структурированы и доступны веб-серверу. Третий: редиректы делайте канонизирующими и проверяйте на отсутствие циклов, особенно когда участвуют www/non-www, HTTPS и переезд путей.

Если вам нужно сделать несколько сайтов на одном сервере, начните с простого: один домен, один root, один редирект с HTTP на HTTPS. Затем добавляйте второй домен, потом редиректы по папкам и только после этого — поддомены и wildcard. Такой порядок помогает быстро локализовать ошибку и сохранить контроль над тем, какие URL куда ведут.