![lighttpd 1.4.46+ 基於 $HTTP["useragent"] 提供特定文件](https://rvso.com/image/784175/lighttpd%201.4.46%2B%20%E5%9F%BA%E6%96%BC%20%24HTTP%5B%22useragent%22%5D%20%E6%8F%90%E4%BE%9B%E7%89%B9%E5%AE%9A%E6%96%87%E4%BB%B6.png)
我在 Linux 上有一個 lighttpd 伺服器版本 1.4.46+,它可以提供服務文件1.xml和文件2.xml從文件目錄原樣。有一些客戶端請求這些文件,每個客戶端都會發送一個使用者代理到伺服器的標頭,其格式我的應用12345在哪裡12345是客戶端版本。
我需要做的是解析版本號12345並服務其中之一文件1.xml或者文件2.xml,取決於客戶端版本號。文件1.xml需要提供給以下版本號碼的用戶端11255和文件2.xml需要向客戶端提供版本號11255和上面,然後反向。
做到這一點最簡單的方法是什麼?最好是避免重定向,並且最好是避免 shell 或 Perl 腳本如果可能的話,參與其中。避免重定向位於最高優先權,而使用腳本時位於較低優先級。
有沒有 lighttpd 專家可以幫助我嗎?
我嘗試過 Perl 風格的正規表示式匹配 (=~)$HTTP["用戶代理"]並設定條件伺服器.文檔根目錄到server_root +“/htdocs/file1”或者“/htdocs/file2”包括這兩份文件,但失敗了。
我想嘗試一下包含外殼,但不確定如何將參數傳遞給可以處理版本號的腳本,並可能根據結果編寫包含設定檔。我可以為版本號碼新增 if 條件1-11254服務文件1.xml但條件清單會變得非常龐大,看起來是錯的。
答案1
你可以使用lighttpd模組磁鐵以及幾行自訂 lua 程式碼。
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
以上內容未經測試,適用於 lighttpd 1.4.60 或更高版本。 lighttpd 的目前版本是lighttpd 1.4.69。如果您使用的是 lighttpd 1.4.46,則您的系統可能維護不善且非常過時,但您可以在同一文件上找到有關較舊的 lighttpd mod_magnet 介面的資訊:lighttpd模組磁鐵