Я хочу установить временное перенаправление на другой домен, но хочу, чтобы путь был очень похожим.
Вот пример:
Запрос URL: https://api.mydomain.com/uploads/default/logo.png
Переписанный URL должен быть: https://cdn.mydomain.com/default/logo.png
Я установил правило следующим образом, но оно не работает:
{
server api.mydomain.com
location /uploads/(.*)$ {
rewrite ^ $scheme://cdn.mydomain.com/$1 redirect;
}
}
Некоторые объяснения, почему ваше решение по перезаписи не работает. Директива rewrite
рассматривает свой первый параметр как regex. Вы используете ^
в качестве regex (очень распространенный подход для соответствия любой строке), и после соответствия regex $1
переменная имеет пустое значение, потому что ^
regex-шаблон не имеет групп захвата. Таким образом, предыдущее значение переменной $1
теряется. В противоположном случае директива return
не рассматривает ни один параметр как regex и значение переменной $1
не изменяется.
Что можно сделать, чтобы предотвратить потерю значения переменной $1
? Вот еще два возможных решения:
location
:
{
сервер api.mydomain.com
location /uploads/(?.*) {
rewrite ^ $scheme://cdn.mydomain.com/$suffix redirect;
}
...
}
rewrite
в контексте server
вместо location
:
{
сервер api.mydomain.com
rewrite ^/uploads/(.*) $scheme://cdn.mydomain.com/$1 redirect;
...
}
Иногда использование числовых групп захвата приводит к ошибкам, которые очень трудно отследить, например, смотрите этот вопрос/ответ.
Получил решение.
Это было очень просто, я проработал это с помощью перенаправления. (Хотя, не смог заставить его работать с помощью rewrite)
Вот обновленная конфигурация:
location ~ ^/uploads/(.*)$ {
return 302 $scheme://cdn.mydomain.com/$1;
}