![lighttpd 1.4.46+ stellt bestimmte Dateien basierend auf $HTTP["useragent"] bereit](https://rvso.com/image/784175/lighttpd%201.4.46%2B%20stellt%20bestimmte%20Dateien%20basierend%20auf%20%24HTTP%5B%22useragent%22%5D%20bereit.png)
Ich habe einen Lighttpd-Server der Version 1.4.46+ unter Linux, derfile1.xmlUndfile2.xmlausAbonnierenVerzeichnis wie es ist. Es gibt Clients, die diese Dateien anfordern, jeder von ihnen sendet eineUser-AgentHeader an den Server, die das Format habenMeineApp 12345Wo12345ist die Client-Version.
Was ich tun muss, ist die Versionsnummer zu analysieren12345und dienen entwederfile1.xmloderfile2.xml, abhängig von der Client-Versionsnummer.file1.xmlmuss an Clients mit der Versionsnummer unten ausgeliefert werden11255Undfile2.xmlmuss Clients mit der Versionsnummer bereitgestellt werden11255und darüber und umgekehrt.
Wie geht das am einfachsten? Am bestenWeiterleitungen vermeidenund vorzugsweise zuVermeiden Sie Shell- oder Perl-Skriptebeteiligt, wenn möglich. Die Vermeidung von Weiterleitungen isthöchste Priorität, während die Verwendung eines Skriptsgeringere Priorität.
Gibt es hier Lighttpd-Gurus, die mir bitte weiterhelfen können?
Ich habe versucht, reguläre Ausdrücke im Perl-Stil zu finden (=~) auf$HTTP["Benutzeragent"]und Setzen von BedingungenServer.DokumentstammverzeichnisZuServer-Stammverzeichnis + "/htdocs/Datei1"oder"/htdocs/Datei2"das beide Dateien enthält, aber fehlgeschlagen ist.
Ich wollte es versucheninclude_shell, aber ich bin mir nicht sicher, wie ich Argumente an das Skript übergeben soll, das die Versionsnummer verarbeiten und möglicherweise eine Include-Konfigurationsdatei basierend auf den Ergebnissen schreiben kann. Ich könnte möglicherweise if-Bedingungen für Versionsnummern hinzufügen1-11254dienenfile1.xmlaber die Liste der Bedingungen würde sehr umfangreich werden, was falsch aussieht.
Antwort1
Sie können lighttpd verwendenmod_magnetund ein paar Zeilen benutzerdefinierten Lua-Codes.
local r = lighty.r
if r.req_attr["physical.path"] == "/path/to/htdocs/file.xml" then
local ver = string.match(r.req_header["User-Agent"], "MyApp (%d+)")
local path = string.sub(r.req_attr["physical.path"], 1, -4) -- remove '.xml'
if ver and ver > 12345 then
r.req_attr["physical.path] = path .. "2.xml"
else
r.req_attr["physical.path] = path .. "1.xml"
end
r.resp_header["Vary"] = "User-Agent"
end
return 0
Das Obige ist ungetestet und für lighttpd 1.4.60 oder höher. Die aktuelle Version von lighttpd ist lighttpd 1.4.69. Wenn Sie lighttpd 1.4.46 verwenden, ist es wahrscheinlich, dass Ihre Systeme schlecht gewartet und sehr veraltet sind, aber Sie können Informationen zu den älteren lighttpd mod_magnet-Schnittstellen im selben Dokument finden: lighttpdmod_magnet