Вопрос или проблема
Я пытаюсь настроить 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.