mirror of
https://github.com/caddyserver/caddy.git
synced 2024-12-27 06:03:48 +03:00
httpcaddyfile: Wrap site block in subroute if host matcher used (#5130)
* httpcaddyfile: Wrap site block in subroute if host matcher used (fix #5124) * Correct boolean logic (oops)
This commit is contained in:
parent
33f60da9f2
commit
3e1fd2a8d4
4 changed files with 117 additions and 82 deletions
|
@ -907,11 +907,32 @@ func appendSubrouteToRouteList(routeList caddyhttp.RouteList,
|
||||||
return routeList
|
return routeList
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// No need to wrap the handlers in a subroute if this is the only server block
|
||||||
|
// and there is no matcher for it (doing so would produce unnecessarily nested
|
||||||
|
// JSON), *unless* there is a host matcher within this site block; if so, then
|
||||||
|
// we still need to wrap in a subroute because otherwise the host matcher from
|
||||||
|
// the inside of the site block would be a top-level host matcher, which is
|
||||||
|
// subject to auto-HTTPS (cert management), and using a host matcher within
|
||||||
|
// a site block is a valid, common pattern for excluding domains from cert
|
||||||
|
// management, leading to unexpected behavior; see issue #5124.
|
||||||
|
wrapInSubroute := true
|
||||||
if len(matcherSetsEnc) == 0 && len(p.serverBlocks) == 1 {
|
if len(matcherSetsEnc) == 0 && len(p.serverBlocks) == 1 {
|
||||||
// no need to wrap the handlers in a subroute if this is
|
var hasHostMatcher bool
|
||||||
// the only server block and there is no matcher for it
|
outer:
|
||||||
routeList = append(routeList, subroute.Routes...)
|
for _, route := range subroute.Routes {
|
||||||
} else {
|
for _, ms := range route.MatcherSetsRaw {
|
||||||
|
for matcherName := range ms {
|
||||||
|
if matcherName == "host" {
|
||||||
|
hasHostMatcher = true
|
||||||
|
break outer
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
wrapInSubroute = hasHostMatcher
|
||||||
|
}
|
||||||
|
|
||||||
|
if wrapInSubroute {
|
||||||
route := caddyhttp.Route{
|
route := caddyhttp.Route{
|
||||||
// the semantics of a site block in the Caddyfile dictate
|
// the semantics of a site block in the Caddyfile dictate
|
||||||
// that only the first matching one is evaluated, since
|
// that only the first matching one is evaluated, since
|
||||||
|
@ -929,7 +950,10 @@ func appendSubrouteToRouteList(routeList caddyhttp.RouteList,
|
||||||
if len(route.MatcherSetsRaw) > 0 || len(route.HandlersRaw) > 0 {
|
if len(route.MatcherSetsRaw) > 0 || len(route.HandlersRaw) > 0 {
|
||||||
routeList = append(routeList, route)
|
routeList = append(routeList, route)
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
routeList = append(routeList, subroute.Routes...)
|
||||||
}
|
}
|
||||||
|
|
||||||
return routeList
|
return routeList
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,9 +3,7 @@
|
||||||
timeouts {
|
timeouts {
|
||||||
idle 90s
|
idle 90s
|
||||||
}
|
}
|
||||||
protocol {
|
strict_sni_host insecure_off
|
||||||
strict_sni_host insecure_off
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
servers :80 {
|
servers :80 {
|
||||||
timeouts {
|
timeouts {
|
||||||
|
@ -16,9 +14,7 @@
|
||||||
timeouts {
|
timeouts {
|
||||||
idle 30s
|
idle 30s
|
||||||
}
|
}
|
||||||
protocol {
|
strict_sni_host
|
||||||
strict_sni_host
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,12 @@
|
||||||
:8884
|
:8884
|
||||||
|
|
||||||
@api host example.com
|
# the use of a host matcher here should cause this
|
||||||
php_fastcgi @api localhost:9000
|
# site block to be wrapped in a subroute, even though
|
||||||
|
# the site block does not have a hostname; this is
|
||||||
|
# to prevent auto-HTTPS from picking up on this host
|
||||||
|
# matcher because it is not a key on the site block
|
||||||
|
@test host example.com
|
||||||
|
php_fastcgi @test localhost:9000
|
||||||
----------
|
----------
|
||||||
{
|
{
|
||||||
"apps": {
|
"apps": {
|
||||||
|
@ -13,13 +18,6 @@ php_fastcgi @api localhost:9000
|
||||||
],
|
],
|
||||||
"routes": [
|
"routes": [
|
||||||
{
|
{
|
||||||
"match": [
|
|
||||||
{
|
|
||||||
"host": [
|
|
||||||
"example.com"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"handle": [
|
"handle": [
|
||||||
{
|
{
|
||||||
"handler": "subroute",
|
"handler": "subroute",
|
||||||
|
@ -27,82 +25,99 @@ php_fastcgi @api localhost:9000
|
||||||
{
|
{
|
||||||
"handle": [
|
"handle": [
|
||||||
{
|
{
|
||||||
"handler": "static_response",
|
"handler": "subroute",
|
||||||
"headers": {
|
"routes": [
|
||||||
"Location": [
|
|
||||||
"{http.request.orig_uri.path}/"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"status_code": 308
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"match": [
|
|
||||||
{
|
|
||||||
"file": {
|
|
||||||
"try_files": [
|
|
||||||
"{http.request.uri.path}/index.php"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"not": [
|
|
||||||
{
|
{
|
||||||
"path": [
|
"handle": [
|
||||||
"*/"
|
{
|
||||||
|
"handler": "static_response",
|
||||||
|
"headers": {
|
||||||
|
"Location": [
|
||||||
|
"{http.request.orig_uri.path}/"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"status_code": 308
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"match": [
|
||||||
|
{
|
||||||
|
"file": {
|
||||||
|
"try_files": [
|
||||||
|
"{http.request.uri.path}/index.php"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"not": [
|
||||||
|
{
|
||||||
|
"path": [
|
||||||
|
"*/"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"handle": [
|
||||||
|
{
|
||||||
|
"handler": "rewrite",
|
||||||
|
"uri": "{http.matchers.file.relative}"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"match": [
|
||||||
|
{
|
||||||
|
"file": {
|
||||||
|
"split_path": [
|
||||||
|
".php"
|
||||||
|
],
|
||||||
|
"try_files": [
|
||||||
|
"{http.request.uri.path}",
|
||||||
|
"{http.request.uri.path}/index.php",
|
||||||
|
"index.php"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"handle": [
|
||||||
|
{
|
||||||
|
"handler": "reverse_proxy",
|
||||||
|
"transport": {
|
||||||
|
"protocol": "fastcgi",
|
||||||
|
"split_path": [
|
||||||
|
".php"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"upstreams": [
|
||||||
|
{
|
||||||
|
"dial": "localhost:9000"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"match": [
|
||||||
|
{
|
||||||
|
"path": [
|
||||||
|
"*.php"
|
||||||
|
]
|
||||||
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"handle": [
|
|
||||||
{
|
|
||||||
"handler": "rewrite",
|
|
||||||
"uri": "{http.matchers.file.relative}"
|
|
||||||
}
|
|
||||||
],
|
],
|
||||||
"match": [
|
"match": [
|
||||||
{
|
{
|
||||||
"file": {
|
"host": [
|
||||||
"split_path": [
|
"example.com"
|
||||||
".php"
|
|
||||||
],
|
|
||||||
"try_files": [
|
|
||||||
"{http.request.uri.path}",
|
|
||||||
"{http.request.uri.path}/index.php",
|
|
||||||
"index.php"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"handle": [
|
|
||||||
{
|
|
||||||
"handler": "reverse_proxy",
|
|
||||||
"transport": {
|
|
||||||
"protocol": "fastcgi",
|
|
||||||
"split_path": [
|
|
||||||
".php"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"upstreams": [
|
|
||||||
{
|
|
||||||
"dial": "localhost:9000"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"match": [
|
|
||||||
{
|
|
||||||
"path": [
|
|
||||||
"*.php"
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
]
|
],
|
||||||
|
"terminal": true
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
|
@ -66,7 +66,7 @@ func init() {
|
||||||
// `{http.request.orig_uri}` | The request's original URI
|
// `{http.request.orig_uri}` | The request's original URI
|
||||||
// `{http.request.port}` | The port part of the request's Host header
|
// `{http.request.port}` | The port part of the request's Host header
|
||||||
// `{http.request.proto}` | The protocol of the request
|
// `{http.request.proto}` | The protocol of the request
|
||||||
// `{http.request.remote.host}` | The host part of the remote client's address
|
// `{http.request.remote.host}` | The host (IP) part of the remote client's address
|
||||||
// `{http.request.remote.port}` | The port part of the remote client's address
|
// `{http.request.remote.port}` | The port part of the remote client's address
|
||||||
// `{http.request.remote}` | The address of the remote client
|
// `{http.request.remote}` | The address of the remote client
|
||||||
// `{http.request.scheme}` | The request scheme
|
// `{http.request.scheme}` | The request scheme
|
||||||
|
|
Loading…
Reference in a new issue