Рейтинг:1

Замена одного и того же значения несколько раз с помощью nginx sub_filter

флаг in

Редактировать: Воспроизводимый пример: https://github.com/searchingforlife/nginx-замена

Я пытаюсь добавить/ввести произвольное количество скриптов в файл/выход HTML. Все они фильтруют по одному и тому же значению </body> вводить себе.

Версия nginx: nginx/1.16.1

Представьте, что у нас есть два файла conf (упрощенно):

# script_one.conf

sub_filter "</body>" "<script src='/one.js'></script></body>";
# script_two.conf

sub_filter "</body>" "<script src='/two.js'></script></body>";

И наш основной файл конфигурации nginx:

местоположение / один {
  sub_filter_once выключен;
  включить /script_one.conf;
  включить /script_two.conf;
}

Однако это не работает, и nginx добавляет только первый скрипт. Если значение фильтра отличается (скажем, один фильтр на </head> а другой на </body>), то nginx внедряет оба скрипта.

Есть ли способ обойти это ограничение и заставить nginx внедрять оба скрипта? Я знаю, что могу создать новый файл конфигурации, который объединяет оба сценария в один, и включить его, но он просто не масштабируется, когда у вас есть более 10 сценариев для внедрения, которые можно комбинировать различными способами в зависимости от местоположения.

Michael Hampton avatar
флаг cz
Как показано, это должно работать. Вероятно, происходит что-то еще. Пожалуйста, опубликуйте вывод `nginx -T`.
searchingforlife avatar
флаг in
@MichaelHampton Добавлен репозиторий для воспроизведения этого поведения: https://github.com/searchingforlife/nginx-substitution.
mforsetti avatar
флаг tz
попробуйте использовать `">
Рейтинг:0
флаг in

В итоге я подумал о другом подходе, который переписывается только один раз. Если кому интересно, смотрите ветку решения: https://github.com/searchingforlife/nginx-substitution/tree/solution

По сути, мы создаем переменную, содержащую имена скриптов для внедрения, а затем внедряем их все сразу. Таким образом, мы в конечном итоге переписываем только один раз.

расположение ~ ^/ {
  установить $js_args "один, два";
  включить scripts.conf;
}
# скрипты.conf

если ($js_args ~ "^$") {
  установить $js_args '';
}

установить $скрипты "";

если ($js_args ~* "(,|^)один([,]|$)") {
  установить $scripts "${scripts}<script src='/one.js'></script>";
}

если ($js_args ~* "(,|^)два([,]|$)") {
  установить $scripts "${scripts}<script src='/two.js'></script>";
}

sub_filter "</body>" "${scripts}</body>";
Рейтинг:0
флаг us

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

Теперь, когда nginx читает конфигурационный файл по порядку, он сначала добавляет ключ </body> на карту замены, а затем заменяет ее второй.

searchingforlife avatar
флаг in
Вы, вероятно, правы.Вместо этого я подумал о другом подходе, который, кажется, решает эту проблему, когда мы переписываем только один раз. Если кому интересно, смотрите ветку решения: https://github.com/searchingforlife/nginx-substitution/tree/solution

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.