Я пытаюсь переписать систему 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;
}
Или как бы это выглядело?
Упс, да небольшая опечатка, извините. Исправлена.
Вы можете зафиксировать значение arg с помощью следующей карты:
map $args $arg_value {
~=(.*) $1;
}
Затем перенаправьте на него:
location = /data/ {
return 301 http://example.com/datastore/$arg_value;
}
Проблема в том, что main_loc является одним из возможных местоположений и запускает дополнительные в зависимости от региона, который может называться как угодно _loc, поэтому в имени arg необходим какой-то подстановочный знак или регулярное выражение.
Я обновил свой ответ, чтобы игнорировать имя аргумента.
Могу ли я использовать $arg_value при перезаписи, чтобы превратить данные в хранилище данных, или это работает только с перенаправлением? Я бы предпочел использовать перезапись, чтобы уменьшить проблемы с их кешированием браузерами.
Вы можете попробовать, но мне это не нужно. На самом деле return
предпочтительнее rewrite
в соответствии с Эта статья.
Для полноты, как будет выглядеть переписывание? (помогает мне с тестированием, так как main_loc в данный момент находится в том же экземпляре nginx)
Я попытался перезаписать в /datastore/$arg_value; но это, похоже, не отправляет его в / datastore / местоположение только в /. Есть ли особый способ перезаписи в место на том же сервере?
Я избегаю переписывать правила, так что я не тот, кто спрашивает. Автор nginx, Игорь Сысоев, объясняет, почему следует соблюдать осторожность при использовании местоположений перезаписи, а также регулярных выражений.
Вы уверены, что ваш исходный URL-адрес действительно выглядит так
http://cdn.example.com/data/main_loc?=datastring
?