diff options
author | Matthew Holt <mholt@users.noreply.github.com> | 2020-06-03 09:35:13 -0600 |
---|---|---|
committer | Matthew Holt <mholt@users.noreply.github.com> | 2020-06-03 09:35:13 -0600 |
commit | 97e61c16a3a0e74be0810b4714de1dab345fba8b (patch) | |
tree | 8a0675822fb38022ccda2cc6c310060ba7cd6d02 | |
parent | 83551edf3e050b5dd094fc1cff20a3f78c4d621f (diff) |
httpcaddyfile: Sort site blocks with wildcards last (fix #3410)
-rw-r--r-- | caddyconfig/httpcaddyfile/httptype.go | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/caddyconfig/httpcaddyfile/httptype.go b/caddyconfig/httpcaddyfile/httptype.go index 7bb7c56..7be932f 100644 --- a/caddyconfig/httpcaddyfile/httptype.go +++ b/caddyconfig/httpcaddyfile/httptype.go @@ -377,7 +377,11 @@ func (st *ServerType) serversFromPairings( // but I don't expect many blocks will have THAT many keys... var iLongestPath, jLongestPath string var iLongestHost, jLongestHost string + var iWildcardHost, jWildcardHost bool for _, addr := range p.serverBlocks[i].keys { + if strings.Contains(addr.Host, "*.") { + iWildcardHost = true + } if specificity(addr.Host) > specificity(iLongestHost) { iLongestHost = addr.Host } @@ -386,6 +390,9 @@ func (st *ServerType) serversFromPairings( } } for _, addr := range p.serverBlocks[j].keys { + if strings.Contains(addr.Host, "*.") { + jWildcardHost = true + } if specificity(addr.Host) > specificity(jLongestHost) { jLongestHost = addr.Host } @@ -393,6 +400,12 @@ func (st *ServerType) serversFromPairings( jLongestPath = addr.Path } } + if iWildcardHost != jWildcardHost { + // site blocks that have a key with a wildcard in the hostname + // must always be less specific than blocks without one; see + // https://github.com/caddyserver/caddy/issues/3410 + return jWildcardHost && !iWildcardHost + } if specificity(iLongestHost) == specificity(jLongestHost) { return len(iLongestPath) > len(jLongestPath) } |