Nginx: Перезапись с сохранением пути

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

Вот пример:

Запрос 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;
    }

}
0
задан 31 May 2021 в 18:30
2 ответа

Некоторые объяснения, почему ваше решение по перезаписи не работает. Директива rewrite рассматривает свой первый параметр как regex. Вы используете ^ в качестве regex (очень распространенный подход для соответствия любой строке), и после соответствия regex $1 переменная имеет пустое значение, потому что ^ regex-шаблон не имеет групп захвата. Таким образом, предыдущее значение переменной $1 теряется. В противоположном случае директива return не рассматривает ни один параметр как regex и значение переменной $1 не изменяется.

Что можно сделать, чтобы предотвратить потерю значения переменной $1? Вот еще два возможных решения:

  • Используйте named capture group в директиве 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;
    
     ...
    
    }
    

Иногда использование числовых групп захвата приводит к ошибкам, которые очень трудно отследить, например, смотрите этот вопрос/ответ.

0
ответ дан 28 July 2021 в 14:39

Получил решение.

Это было очень просто, я проработал это с помощью перенаправления. (Хотя, не смог заставить его работать с помощью rewrite)

Вот обновленная конфигурация:


 location ~ ^/uploads/(.*)$ {
           return 302 $scheme://cdn.mydomain.com/$1;
    }
0
ответ дан 28 July 2021 в 14:39

Теги

Похожие вопросы