Ответ 1
Это представляется возможным благодаря нескольким различным подходам, но это не означает, насколько это целесообразно.
Кажется, что это потенциально проблематично (например: что, если вы переписываете то, что не должно было быть переписано?) и машинно-ресурсоемкие (много циклов процессора для синтаксического анализа и массирования органов реагирования неоднократно).
Вот что я нашел:
Nginx имеет http_sub_module, который, как представляется, выполняется довольно просто, предполагая, что вы хотите заменить, просто и вы нужно только сопоставить один шаблон на странице, например, заменять <a href="http://example.com/...
на <a href="https://example.com/...
один или несколько раз. Такой контент-маргаризм кажется отрывочным, но в зависимости от ситуации, в которой вы находитесь (возможно, это ограниченный контроль над приложением), он может попасть туда.
Похоже, что там что-то называется http_substitutions_filter, возможно, неофициальным или, по крайней мере, не является частью основного дистрибутива Nginx, который может сделать более мощный фильтрация на основе фильтров тел реакции.
Лак похоже, имеет аналогичную возможность (возможно, плагин), но HAProxy не делает, поскольку он касается только заголовков и оставляет тела в одиночку, за исключением случаев разгрузки gzip. Другое программное обеспечение, поддерживающее обратное прокси-сервер, такое как Apache или Squid, может также предложить что-то полезное, которое вы разместили бы перед своим сервером приложений.
Мое первоначальное впечатление, во всяком случае, состоит в том, что простая замена строки может не совсем получить вас там, и даже замена на основе регулярных выражений на самом деле не достаточна, без существенной сложности в регулярных выражениях, поскольку вы всегда рискуете переписать то, чего вы не должны.
То, что я бы предложил "действительно должно произойти" для достижения этой цели самым правильным образом, состояло в том, чтобы фактически интерпретировать сгенерированный HTML с помощью библиотеки разбора DOM, пересекать дерево и модифицировать соответствующие элементы, перед передачей пересмотренного документа запрашивающему лицу. Таким образом, документ изменяется на основе контекстуального понимания его содержимого.
Это звучит сложно, на мой взгляд, потому что это так, поэтому я бы снова предложил вам пересмотреть свой запланированный подход, если это не находится за пределами вашего контроля.
Заключительная мысль: Любопытство получило лучшее из меня, поэтому я взял этот вопрос и модифицировал обратный прокси-адрес http, который я написал (для другой цели), так что, основываясь на типе контента, он мог фактически анализировать и ходить по HTML (как описано выше), прежде чем вернуть тело ответа запрашивающему лицу.
Это, как я и ожидалось, будет достаточно интенсивным для процессора. Мое тестовое содержимое было 29K реального мира HTML с живого сайта, содержащего 56 элементов <a href ...>
и 6 <link rel ...>
, а для операции перезаписи требовалось 128 мс на 1 ГГц Opteron 1218 и 43 мс 2,4 ГГц Xeon E5620. Эти контрольные показатели предназначены исключительно для дополнительных операций - исключая (меньшее количество) время, необходимое для фактической самой функции "прокси". На этот раз стоимость не является непреодолимой, но может привести к большому количеству процессорного времени. Это намного дольше, чем будет требоваться переписывание контента на основе выражений, но гораздо точнее и вряд ли сломать страницы, которые он затрагивает.