summaryrefslogtreecommitdiff
path: root/caddyconfig/httpcaddyfile
diff options
context:
space:
mode:
authorMatthew Holt <mholt@users.noreply.github.com>2022-08-09 11:11:52 -0600
committerMatthew Holt <mholt@users.noreply.github.com>2022-08-09 11:12:09 -0600
commit91ab0e60669b84b7c09189a06de0d6a9771bf950 (patch)
tree5a21976f08149dfecbae091dc560d4110d087770 /caddyconfig/httpcaddyfile
parent085df25c7e82b5bdd198787232d559f2ac1e72eb (diff)
httpcaddyfile: redir with "html" emits 200, no Location (fix #4940)
The intent of "html" is to redirect browser clients only, or those which can evaluate JS and/or meta tags. So return HTTP 200 and no Location header. See #4940.
Diffstat (limited to 'caddyconfig/httpcaddyfile')
-rw-r--r--caddyconfig/httpcaddyfile/builtins.go17
1 files changed, 14 insertions, 3 deletions
diff --git a/caddyconfig/httpcaddyfile/builtins.go b/caddyconfig/httpcaddyfile/builtins.go
index 5c539e2..cd23348 100644
--- a/caddyconfig/httpcaddyfile/builtins.go
+++ b/caddyconfig/httpcaddyfile/builtins.go
@@ -540,8 +540,13 @@ func parseVars(h Helper) (caddyhttp.MiddlewareHandler, error) {
// parseRedir parses the redir directive. Syntax:
//
-// redir [<matcher>] <to> [<code>]
+// redir [<matcher>] <to> [<code>]
//
+// <code> can be "permanent" for 301, "temporary" for 302 (default),
+// a placeholder, or any number in the 3xx range or 401. The special
+// code "html" can be used to redirect only browser clients (will
+// respond with HTTP 200 and no Location header; redirect is performed
+// with JS and a meta tag).
func parseRedir(h Helper) (caddyhttp.MiddlewareHandler, error) {
if !h.Next() {
return nil, h.ArgErr()
@@ -558,6 +563,7 @@ func parseRedir(h Helper) (caddyhttp.MiddlewareHandler, error) {
}
var body string
+ var hdr http.Header
switch code {
case "permanent":
code = "301"
@@ -578,7 +584,7 @@ func parseRedir(h Helper) (caddyhttp.MiddlewareHandler, error) {
`
safeTo := html.EscapeString(to)
body = fmt.Sprintf(metaRedir, safeTo, safeTo, safeTo, safeTo)
- code = "302"
+ code = "200" // don't redirect non-browser clients
default:
// Allow placeholders for the code
if strings.HasPrefix(code, "{") {
@@ -601,9 +607,14 @@ func parseRedir(h Helper) (caddyhttp.MiddlewareHandler, error) {
}
}
+ // don't redirect non-browser clients
+ if code != "200" {
+ hdr = http.Header{"Location": []string{to}}
+ }
+
return caddyhttp.StaticResponse{
StatusCode: caddyhttp.WeakString(code),
- Headers: http.Header{"Location": []string{to}},
+ Headers: hdr,
Body: body,
}, nil
}