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_filter
2
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 "";