![lighttpd 1.4.46+ 根据 $HTTP["useragent"] 提供特定文件](https://linux22.com/image/784175/lighttpd%201.4.46%2B%20%E6%A0%B9%E6%8D%AE%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["用户代理"]并设置条件服务器.document-root到server_root + “/htdocs/file1”或者“/htdocs/file2”包含两个文件,但是失败了。
我想尝试包括_shell,但不确定如何将参数传递给可以处理版本号的脚本,并可能根据结果编写包含配置文件。我可能会为版本号添加 if 条件1-11254服务文件1.xml但这个条件列表会变得非常长,这看起来是不对的。
答案1
你可以使用 lighttpdmod_magnet以及几行自定义的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 接口的信息:lighttpdmod_magnet