Конфигурация Nginx для создания микросайтов на одном доменном веб-сайте

Вопрос или проблема

Я пытаюсь настроить Nginx для создания микро-сайтов на одно доменное веб-сайте. Это сайт на WordPress, который имеет несколько пользовательских типов записей с определенными URL в подкаталогах.

  • example.com/cpt1/post_id
  • example.com/cpt2/post_id
  • example.com/cpt3/post_id

Я хочу, чтобы у них была следующая структура URL для посетителей

  • cpt1.foo.com/article/post_id
  • cpt2.foo.com/article/post_id
  • cpt3.foo.com/article/post_id

А главная страница cpt_x.foo.com должна быть example.com/cptx_main, что является отдельными страницами.

По сути, это 1 страница + 1 CPT (и мне также нужно настроить меню и категории, но они менее важны)

Я попробовал использовать proxy_pass в Nginx на foo.com, как показано ниже.

server {
    listen       80;
    server_name cpt1.foo.com;

    location /article/ {
        rewrite ^/article/(.*)$ /cpt1/$1 break;  
        proxy_pass http://127.0.0.1;  
        proxy_set_header Host example.com;  
        include /etc/nginx/global/proxy-pass-settings.conf;
    }

    location / {
        rewrite ^/(.*)$ /cpt1_main/$1 break;  # Переписываем URL
        proxy_pass http://127.0.0.1;  # Перенаправляем запрос на бэкенд
        proxy_set_header Host example.com;  # Сохраняем оригинальный заголовок хоста
        include /etc/nginx/global/proxy-pass-settings.conf;
    }

Где файл proxy-pass-settings.conf содержит настройки для прокси – бэкенда

proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Nginx-Proxy true;
proxy_redirect off;

До вышеуказанного, это неплохо обслуживает каждую запись/страницу для посетителей, которые приходят на cpt_x.foo.com.

Но когда они кликают на другие записи, серфя по моему сайту, они видят оригинальный URL, а именно

  • example.com/cpt_x/post_id

Я хочу, чтобы они продолжали на cpt_x.foo.com/article/post_id.

Думаю, мне нужно сделать еще один шаг в блоке сервера example.com. Если я настрою перенаправление с /cpt_x/(.*)$ на cpt_x.foo.com/article/$1, то URL в браузере меняется, но я получаю 404. Полагаю, это происходит из-за того, что контент перенаправляется. Когда я изменяю мелкие детали, такие как регулярные выражения, у меня возникает слишком много перенаправлений.

Я собирался настроить что-то вроде алиаса, но не смог добиться успеха.

Я также протестировал несколько плагинов для WordPress, но большинство из них не поддерживают пользовательские типы записей. Если есть какой-либо код, который может решить эту проблему, было бы замечательно.

Ответ или решение

Для решения задачи по настройке Nginx для микросайтов на одном домене с использованием WordPress, требуется учесть несколько аспектов. Ваша основная цель — чтобы посетители могли видеть URL в формате cpt1.foo.com/article/post_id, а также чтобы переходы между постами сохраняли этот формат URL.

Настройка Nginx для cpt_x.foo.com

Вот пример конфигурации Nginx для поддоменов, где каждый поддомен будет соответствовать определенному Custom Post Type (CPT):

server {
    listen       80;
    server_name cpt1.foo.com;

    location /article/ {
        rewrite ^/article/(.*)$ /cpt1/$1 break;  
        proxy_pass http://127.0.0.1;  
        proxy_set_header Host example.com;  
        include /etc/nginx/global/proxy-pass-settings.conf;
    }

    location / {
        rewrite ^/(.*)$ /cpt1_main break;  # Переход на финансовую страницу CPT
        proxy_pass http://127.0.0.1;  
        proxy_set_header Host example.com;  
        include /etc/nginx/global/proxy-pass-settings.conf;
    }
}

server {
    listen       80;
    server_name cpt2.foo.com;

    location /article/ {
        rewrite ^/article/(.*)$ /cpt2/$1 break;  
        proxy_pass http://127.0.0.1;  
        proxy_set_header Host example.com;  
        include /etc/nginx/global/proxy-pass-settings.conf;
    }

    location / {
        rewrite ^/(.*)$ /cpt2_main break;
        proxy_pass http://127.0.0.1;  
        proxy_set_header Host example.com;  
        include /etc/nginx/global/proxy-pass-settings.conf;
    }
}

server {
    listen       80;
    server_name cpt3.foo.com;

    location /article/ {
        rewrite ^/article/(.*)$ /cpt3/$1 break;  
        proxy_pass http://127.0.0.1;  
        proxy_set_header Host example.com;  
        include /etc/nginx/global/proxy-pass-settings.conf;
    }

    location / {
        rewrite ^/(.*)$ /cpt3_main break;
        proxy_pass http://127.0.0.1;  
        proxy_set_header Host example.com;  
        include /etc/nginx/global/proxy-pass-settings.conf;
    }
}

Настройка основного сервера на example.com

Основной сервер example.com должен быть настроен таким образом, чтобы при переходах с поддоменов на страницы CPT не происходило нежелательных редиректов. Мы можем избежать проблем с редиректом, добавив щадящую обработку в конфигурацию Nginx:

server {
    listen 80;
    server_name example.com;

    location /cpt1/ {
        rewrite ^/cpt1/(.*)$ http://cpt1.foo.com/article/$1 redirect;
    }

    location /cpt2/ {
        rewrite ^/cpt2/(.*)$ http://cpt2.foo.com/article/$1 redirect;
    }

    location /cpt3/ {
        rewrite ^/cpt3/(.*)$ http://cpt3.foo.com/article/$1 redirect;
    }

    # Настройка для обработки главных страниц CPT
    location /cpt1_main {
        # Ваши настройки для cpt1_main страницы
    }

    location /cpt2_main {
        # Ваши настройки для cpt2_main страницы
    }

    location /cpt3_main {
        # Ваши настройки для cpt3_main страницы
    }
}

Настройка WordPress (Дополнительно)

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

Вот пример кода, который вы можете добавить в functions.php вашей темы для поддержки поддоменов:

function custom_cpt_redirect() {
    if (is_singular('your_custom_post_type')) {
        // Получаем ID поста и определяем правильный поддомен
        $post_id = get_the_ID();
        $post_type = get_post_type($post_id);
        $subdomain = $post_type . '.foo.com';

        // Формируем новый URL
        $new_url = 'http://' . $subdomain . '/article/' . $post_id;

        // Редирект на новый URL
        wp_redirect($new_url, 301);
        exit;
    }
}
add_action('template_redirect', 'custom_cpt_redirect');

Итог

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

Оцените материал
Добавить комментарий

Капча загружается...