.png)
해결해야 할 흥미로운 조건 해결 문제가 있는데 아직 lighttpd에 대한 온라인 검색 및 문서를 살펴보는 데 운이 없었습니다. 이러한 검색 중 상당수는 여기에 묻는 유사한 질문과 유용한 답변으로 이어졌습니다(해당 질문에 대해 이 질문이 어떻게 실행되는지 살펴보겠습니다.
나는 게이트웨이 라우터(OpenWRT 또는 Turris Omnia를 선호하는 경우 Turris OS)에서 lighttpd를 실행하고 있으며 LAN 측에 있는 서버에 대한 역방향 프록시로서 그것이 파밍하는 길을 가리키는 여러 도메인이 있습니다. 게이트웨이.
일반적인 구성은 다음과 같습니다.
$HTTP["host"] =~ "(a.com|b.com|c.com)$" {
proxy.server = ( "" => ( ( "host" => "..." ) ) )
...
} else $HTTP["host"] =~ "(d.org|e.org)$" {
proxy.server = ( "" => ( ( "host" => "..." ) ) )
...
} else $HTTP["host"] =~ "(f.net|g.net)$" {
proxy.server = ( "" => ( ( "host" => "..." ) ) )
...
}
그것은 오랫동안 꿈을 이루어 왔습니다.
이제 이 라우터에서 직접 제공되는 모든 사이트에 공통된 특정 경로를 원합니다.
다시 한 번 공식적으로:
$HTTP["url"] =~ "^/topdir/subir/" {
server.document-root = "/www/sharedstuff"
}
그리고 나는 이것을 다음과 같이 훌륭하게 결합할 수 있습니다. (그리고 그것은 작동합니다):
$HTTP["url"] =~ "^/topdir/subir/" {
server.document-root = "/www/sharedstuff"
} else {
$HTTP["host"] =~ "(a.com|b.com|c.com)$" {
proxy.server = ( "" => ( ( "host" => "..." ) ) )
...
} else $HTTP["host"] =~ "(d.org|e.org)$" {
proxy.server = ( "" => ( ( "host" => "..." ) ) )
...
} else $HTTP["host"] =~ "(f.net|g.net)$" {
proxy.server = ( "" => ( ( "host" => "..." ) ) )
...
}
}
달콤한.
하지만 여기에 제가 해결하려는 문제가 있습니다. 나는 $HTTP["url"]
하나의 포함된 파일에 조건을 캡슐화하고 $HTTP["host"]
다음과 같이 다른 파일에 조건을 캡슐화하고 싶습니다 .
include "/etc/lighttpd/conf.d/shared.conf" # contains the `$HTTP["url"]` constraint
include "/etc/lighttpd/conf.d/distributed.conf" # contains the `$HTTP["host"]` constraint
여기에 너무 많은 것을 바라고 있는 것인지 궁금합니다. 왜냐하면 나는 그것을 할 방법을 생각하거나 찾을 수 없기 때문입니다.
shared.conf
다음과 같은 구성 문이 존재하는 것과 같은 일부 문이 포함되어 있다고 상상합니다 .
$HTTP["url"] =~ "^/topdir/subir/" {
server.document-root = "/www/sharedstuff"
ignore-all-subsequent-host-match-conditions
}
순진하고 불가능하더라도 또 다른 창의적인 아이디어는 다음 $HTTP["host"]
과 유사하게 다시 작성할 수 있다는 것입니다.
$HTTP["host"] = "null.net"
따라서 후속 일치는 $HTTP["host"] =~ "(a.com|b.com|c.com)$"
모두 실패하고 요청은 로컬로 유지됩니다.
지금까지 살펴본 몇 가지 옵션은 다음과 같습니다.
서버 변수
요청이 처리될 때가 아니라 구성이 로드될 때 평가되므로 진행하지 마십시오.
https://redmine.lighttpd.net/projects/1/wiki/docs_configuration#Using-variables
요청 헤더
setenv.add-request-header
매력적으로 보인다:
https://redmine.lighttpd.net/projects/lighttpd/wiki/Docs_ModSetEnv
shared.conf
사용자 정의 요청 헤더를 설정 한 경우 $REQUEST_HEADER["header"]
in 을 사용하여 테스트할 수 있습니다 distributed.conf
.
https://redmine.lighttpd.net/projects/1/wiki/docs_configuration#조건부 구성
그러나 나는 그것에 대해 어떤 성공도 거두지 못했습니다. 다음과 같은 조건부인 것 같습니다.
$REQUEST_HEADER["my_header"] == "value_I_set" {
# Do not act as a reverse proxy
} else $HTTP["host"] =~ "(a.com|b.com|c.com)$" {
proxy.server = ( "" => ( ( "host" => "..." ) ) )
...
} else $HTTP["host"] =~ "(d.org|e.org)$" {
proxy.server = ( "" => ( ( "host" => "..." ) ) )
...
} else $HTTP["host"] =~ "(f.net|g.net)$" {
proxy.server = ( "" => ( ( "host" => "..." ) ) )
...
}
단순히 작동하지 않으며 그 이유를 실제로 알 수 없습니다. 무슨 일이 일어나고 있는지 확인하기 어렵지만 조건부 처리에 대한 출력을 기록하면 다음 과 일치하는 $REQUEST_HEADER["my_header"]
URL에 대해서도 항상 비어 있는 것 같습니다 shared.conf
.
$HTTP["url"] =~ "^/topdir/subir/" {
setenv.add-request-header = ("my_header" => "value_I_set")
}
조건은 setenv에 의해 설정된 요청 헤더를 테스트하지 않는 것 같습니다.
답변1
가능한 구성 솔루션 중 하나는 공유 구성을 넣는 것입니다.~ 후에조건 $HTTP["host"]
및 귀하의 경우 프록시 구성을 덮어 쓰려면
$HTTP["url"] =~ "^/topdir/subir/" {
server.document-root = "/www/sharedstuff"
proxy.server = ()
}
더욱 유연하고 강력한 또 다른 솔루션: lighttpdmod_magnet몇 줄의 lua로 임의로 복잡한 논리를 작성할 수 있습니다. lighttpd mod_proxy 전에 "공유" 구성이 특정 요청(사용자 정의 lua 스크립트에서)을 처리하도록 할 수 있습니다.
그런데, 다음과 같은 순진한 솔루션도 작동합니까? 공유 구성:
$HTTP["url"] =~ "^/topdir/subir/" {
server.document-root = "/www/sharedstuff"
}
lighttpd.conf에 다음과 같이 포함된 shared.conf에
include "/etc/lighttpd/conf.d/shared.conf" # contains the `$HTTP["url"]` constraint
else {
include "/etc/lighttpd/conf.d/distributed.conf" # contains the `$HTTP["host"]` constraint
}