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_root + "/htdocs/file1"또는"/htdocs/파일2"두 파일을 모두 포함하지만 실패했습니다.

나는 시도하고 싶었다include_shell, 버전 번호를 처리하고 결과에 따라 포함 구성 파일을 작성할 수 있는 스크립트에 인수를 전달하는 방법을 잘 모르겠습니다. 버전 번호에 if 조건을 추가할 수도 있습니다.1-11254봉사하다파일1.xml하지만 그 조건 목록은 매우 커져서 잘못된 것처럼 보입니다.

답변1

lighttpd를 사용할 수 있습니다mod_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

관련 정보