lighttpd 1.4.46+ は $HTTP["useragent"] に基づいて特定のファイルを提供します

lighttpd 1.4.46+ は $HTTP["useragent"] に基づいて特定のファイルを提供します

私はLinux上でlighttpdサーババージョン1.4.46+を使用しており、ファイル1.xmlそしてファイル2.xmlからhtdocsディレクトリはそのままです。これらのファイルを要求するクライアントがあり、それぞれがユーザーエージェントサーバーへのヘッダーはフォーマットがマイアプリ 12345どこ12345クライアントバージョンです。

私がやるべきことはバージョン番号を解析することです12345どちらかを提供するファイル1.xmlまたはファイル2.xmlクライアントのバージョン番号によって異なります。ファイル1.xml以下のバージョン番号のクライアントに提供する必要があります11255そしてファイル2.xmlバージョン番号をクライアントに提供する必要がある11255そして上、そして逆。

これを行う最も簡単な方法は何ですか?できればリダイレクトを避ける、そしてできればシェルやPerlスクリプトを避ける可能であれば、リダイレクトを避けることが重要です。最優先事項スクリプトを使用している間は優先度が低い

私を助けてくれる lighttpd の専門家はいませんか?

私はPerlスタイルの正規表現マッチ(=~)を試しました$HTTP["ユーザーエージェント"]条件付き設定server.ドキュメントルートserver_root + "/htdocs/file1"または"/htdocs/ファイル2"両方のファイルが含まれていますが、失敗しました。

試してみたかったシェルを含めるしかし、バージョン番号を処理し、結果に基づいてインクルード構成ファイルを書き込むことができるスクリプトに引数を渡す方法がわかりません。バージョン番号の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 の現在のバージョンは 1.4.69 です。lighttpd 1.4.46 を実行している場合は、システムのメンテナンスが不十分で非常に古い可能性がありますが、同じドキュメントで古い lighttpd mod_magnet インターフェースに関する情報を見つけることができます: lighttpdモッドマグネット

関連情報