21x9.org | System Administration | Home Automation | Smart Home
13.03.2025

nginx sub_filter

Manchmal muss man einfach Dinge tun, die sich falsch anfühlen. Ich wollte kürzlich ein kleines Tool ausprobieren, es erfordert es, dass eine kleine Javascript-Source in den <head>-Bereich einer Webseite eingebettet wird. Leider hatte ich nur Seiten für den Test zur Verfügung, die es nur durch direktes Herumpatchen im Code ermöglicht hätten, diese Javascript-Source einzubinden. Also blieb mir nur übrig das HTML Gerüst zwischen der Erzeugung durch die Anwendung und der Auslieferung an den Browser on-the-fly zu ändern. Und praktischerweise kann nginx1 genau das.

Möglich macht es die Konfigurationsoption sub_filter2

sub_filter </head>
    '<script defer src="https://example.21x9.org/js/script.js"></script></head>';
sub_filter_once on;

Der Filter sucht nach </head> und ersetzt es durch die <script...-Zeile (das </head> wird natürlich am Zeilenende einfach wieder angefügt). Die Option sub_filter_once on; sorgt dafür, dass die Ersetzung nur einmalig erfolgt. Sollte bei einer Suche nach </head> natürlich eigentlich unnötig sein.

Nach einem reload der nginx-Konfiguration sollte der <script>-Tag nun in jedem Seitenaufruf enthalten sein. Oder nicht? Es kann vorkommen, dass die Ersetzung nicht klappt, z.B. wenn die Seite mittel gzip Komprimiert am nginx vorbeikommt. Dies kann man aber einfach umgehen, indem man der Konfiguration noch folgende Zeile hinzufügt:

proxy_set_header Accept-Encoding "";

  1. https://nginx.org ↩

  2. https://nginx.org/en/docs/http/ngx_http_sub_module.html#example ↩

Tags: nginx sub_filter html gzip

Mehr

  • nginx als Reverse Proxy für Docker Container
  • Serververwaltung mit Ansible
  • Flexible, bootfähige USB-Sticks mit Ventoy
  • Wildcard-Zertifikate mit letsencrypt, lexicon und dehydrated
  • Serverüberwachung mit checkmk

Tags

nginx sub_filter html gzip

Archiv

  • Mar 2025 (2)
  • May 2024 (2)
  • Oct 2023 (1)
  • Aug 2023 (5)
  • Jul 2023 (31)

  • Ältere Einträge (95)

Feeds

Atom 1.0 RSS JSON
  • Datenschutz
  • Impressum
  • Archiv