Nginx переписывает любое имя аргумента

Я пытаюсь переписать систему CDN, которая использует аргументы для указания на данные. Все данные хранятся в одном и том же месте, поэтому при любой перезаписи необходимо переписать $arg_name с подстановочными знаками, а затем передать значение для данных. Повернув это:

http://cdn.example.com/data/?main_loc=datastring

в это:

http://example.com/datastore/datastring

Используя директиву местоположения, я могу получить запрос в /data/, но оттуда я не знаю, как должна выглядеть перезапись, чтобы выполнить «соответствие любому имени аргумента», например main_loc, backup_loc и т. д., чтобы передать его значение как переписать. Могу ли я применить регулярное выражение для соответствия любому имени $arg_name и использовать его значение?

location ^~ /data/ {
    rewrite ^$arg_(\w*\_\w*)$ http://example.com/datastore/$1;
}

Или как бы это выглядело?

Вы уверены, что ваш исходный URL-адрес действительно выглядит так http://cdn.example.com/data/main_loc?=datastring?

user973254 22.04.2022 23:45

Упс, да небольшая опечатка, извините. Исправлена.

user2280032 23.04.2022 00:10
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
0
2
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете зафиксировать значение arg с помощью следующей карты:

map $args $arg_value {
    ~=(.*) $1;
}

Затем перенаправьте на него:

location = /data/ {
    return 301 http://example.com/datastore/$arg_value;
}

Проблема в том, что main_loc является одним из возможных местоположений и запускает дополнительные в зависимости от региона, который может называться как угодно _loc, поэтому в имени arg необходим какой-то подстановочный знак или регулярное выражение.

user2280032 23.04.2022 00:27

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

Cole Tierney 23.04.2022 00:55

Могу ли я использовать $arg_value при перезаписи, чтобы превратить данные в хранилище данных, или это работает только с перенаправлением? Я бы предпочел использовать перезапись, чтобы уменьшить проблемы с их кешированием браузерами.

user2280032 23.04.2022 01:10

Вы можете попробовать, но мне это не нужно. На самом деле return предпочтительнее rewrite в соответствии с Эта статья.

Cole Tierney 23.04.2022 01:23

Для полноты, как будет выглядеть переписывание? (помогает мне с тестированием, так как main_loc в данный момент находится в том же экземпляре nginx)

user2280032 23.04.2022 05:05

Я попытался перезаписать в /datastore/$arg_value; но это, похоже, не отправляет его в / datastore / местоположение только в /. Есть ли особый способ перезаписи в место на том же сервере?

user2280032 23.04.2022 05:36

Я избегаю переписывать правила, так что я не тот, кто спрашивает. Автор nginx, Игорь Сысоев, объясняет, почему следует соблюдать осторожность при использовании местоположений перезаписи, а также регулярных выражений.

Cole Tierney 23.04.2022 05:52

Другие вопросы по теме