Вопрос или проблема
У меня есть приложение на react
, работающие на свежем сервере Ubuntu 24 LEMP. Предыдущая версия этого сервера размещала блог, который находился по адресу www.example.com/blog/
. В новой версии сервера я перенес блог и его содержимое на субдомен, data.example.com/blog/
. Так что www.example.com/blog/....
больше не существует (там вообще нет папки блога).
Теперь мне нужно перенаправить все ранее загруженные файлы из старых директорий, которых больше не существует, на их новые места на субдомене. Старые загрузки находились в таких директориях, как /blog/wp-content/uploads/2016/05/whatever.jpg
– это значит, что год (2016), месяц (05) и файл (whatever.jpg) могли варьироваться, но все остальное было статичным.
Я попробовал множество методов, чтобы сделать это перенаправление, но безуспешно. Может, кто-то укажет мне правильное направление? Вот некоторые примеры того, что я пробовал и с чем потерпел неудачу:
/etc/nginx/sites-available/example.com.conf:
server {
location / {
# эти правила приводят к белой странице с надписью "файл не найден"
# URL в адресной строке вообще не меняется, перенаправление не происходит.
# Конечно, я не активировал их одновременно.
rewrite ^(/blog/wp-content/uploads)(.*)$ https://data.example.com.com/blog/wp-content/uploads/$2 permanent;
rewrite ^(/blog/wp-content/uploads/(.*)/(.*))(.*)$ https://data.example.com.com/blog/wp-content/uploads/$2 permanent;
}
location /blog/wp-content/uploads/ {
# эти грузят оболочку react приложения (хедер/футер и т.д.) без содержимого страницы (я еще не настроил кастомную 404 в react приложении)
# перенаправление не происходит
rewrite ^(/blog/wp-content/uploads/)/(.*)$ https://data.example.com.com/blog/wp-content/uploads/$2 permanent;
rewrite ^(/blog/wp-content/uploads/(.*)/(.*))/(.*)$ https://data.example.com.com/blog/wp-content/uploads/$2 permanent;
}
}
ИЗМЕНЕНИЕ: это не то же самое, что вопрос В Nginx, как я могу переписать все HTTP-запросы на HTTPS, сохраняя поддомен?. Вопрос заключается в перенаправлении всех запросов, сохраняя поддомен, в то время как я спрашиваю, как перенаправить определенные запросы, изменяя поддомен. Я также считаю, что тот факт, что мой путь не существует и содержит частичные подстановочные знаки, усложняет задачу. Мне кажется, что ответы там приведут к перенаправлению всего моего сайта. Это не то, чего я пытаюсь достичь.
Ответ или решение
Ваша задача заключается в перенаправлении запросов от несуществующих путей на новом сервере LEMP на поддомен, где теперь находятся перемещенные ресурсы. Проблема заключается в том, что старые запросы на пути, такие как /blog/wp-content/uploads/2016/05/whatever.jpg
, должны перенаправляться на поддомен data.example.com/blog/...
.
Теория
Веб-сервер Nginx позволяет использовать директиву rewrite
для изменения пути запроса и делает его подходящим инструментом для задачи перенаправления URL. Основной принцип работы rewrite
заключается в том, чтобы определять входящие запросы, соответствующие определенным условиям, и изменять их адреса.
Для вашей задачи важно правильно сконфигурировать выражение регулярного выражения, которое поймает все возможные варианты старых путей и изменит их на новые с учетом структуры ваших файлов/файловых путей. Ваш предыдущий код, очевидно, не решает эту задачу, так как перенаправление либо просто не выполняется, либо приводит к неправильному обработки запроса.
Пример
Вот пример, который может решить вашу проблему. Поскольку проблема заключается в отсутствии правильного перенаправления, давайте посмотрим, как сделать это грамотно:
server {
listen 80;
server_name www.example.com;
location / {
try_files $uri $uri/ =404;
}
# Локция для редиректа старых путей блогов
location ~ ^/blog/wp-content/uploads/(.+) {
rewrite ^/blog/wp-content/uploads/(.+)$ https://data.example.com/blog/wp-content/uploads/$1 permanent;
}
}
Разбор Примера
-
Директива
location
: Здесьlocation
используется с регулярным выражением, начинающимся с^/blog/wp-content/uploads/(.+)
. Это регулярное выражение указывает, что мы обращаемся ко всем запросам, начинающимся с/blog/wp-content/uploads/
, где после них идет произвольная последовательность символов, алчные квантификаторы которых обозначаются(.+)
. Эта конструкция поймает любую вложенность подпапок и файлов. -
Директива
rewrite
:rewrite
здесь изменение пути запроса. Она начинается с той же части/blog/wp-content/uploads/
и добавляет к ней в конец все, что будет поймано в скобочки(.+)
. Таким образом, составляя новый путь,rewrite
сохраняет переменные части старого пути. -
Использование флага
permanent
: Это флаг для постоянного перенаправления с кодом 301, что говорит браузеру и поисковикам, что ресурс навсегда перемещен. Часто именно этого эффекта добиваются в таких сценариях, как у вас.
Применение
Теперь, когда у вас есть корректно настроенная конфигурация, необходимо внести изменения в основной конфигурационный файл вашего Nginx, расположенный обычно в /etc/nginx/sites-available/
и создать символическую ссылку в /etc/nginx/sites-enabled/
, если это еще не сделано. После изменений не забудьте проверить конфигурацию командой nginx -t
и перезагрузите сервер Nginx командой systemctl reload nginx
, чтобы изменения вступили в силу.
Кроме того, убедитесь, что сервер правильно настроен для обслуживания HTTPS-запросов, предполагая, что поддомен также должен быть защищен.
Заключение
Ваша задача требует точной настройки Nginx с использованием возможности регулярных выражений для перенаправления динамических URL. Предложенное решение должно удовлетворить ваши потребности, если вы точно настроите регулярное выражение для соответствия всем нужным вариантам ввода. Тщательно проверьте синтаксис и проводите тестирование после внесения изменений, чтобы убедиться, что все работает как задумано.