summaryrefslogtreecommitdiff
path: root/modules/caddyhttp/rewrite/rewrite.go
diff options
context:
space:
mode:
authorFrancis Lavoie <lavofr@gmail.com>2022-01-13 12:17:15 -0500
committerGitHub <noreply@github.com>2022-01-13 12:17:15 -0500
commit1feb65952acd814f9abcfb8e38f727f4e49e9e68 (patch)
tree8824bcfab94e37f4bd5b73e3615fef898d5efc26 /modules/caddyhttp/rewrite/rewrite.go
parent66de438a98989135dc1e4ce5aeb0c4bc98af8049 (diff)
rewrite: Fix a double-encode issue when using the `{uri}` placeholder (#4516)
Diffstat (limited to 'modules/caddyhttp/rewrite/rewrite.go')
-rw-r--r--modules/caddyhttp/rewrite/rewrite.go13
1 files changed, 13 insertions, 0 deletions
diff --git a/modules/caddyhttp/rewrite/rewrite.go b/modules/caddyhttp/rewrite/rewrite.go
index fbf655c..cd340e3 100644
--- a/modules/caddyhttp/rewrite/rewrite.go
+++ b/modules/caddyhttp/rewrite/rewrite.go
@@ -168,7 +168,20 @@ func (rewr Rewrite) rewrite(r *http.Request, repl *caddy.Replacer, logger *zap.L
// in a temporary variable so that they all read the
// same version of the URI
var newPath, newQuery, newFrag string
+
if path != "" {
+ // Since the 'uri' placeholder performs a URL-encode,
+ // we need to intercept it so that it doesn't, because
+ // otherwise we risk a double-encode of the path.
+ uriPlaceholder := "{http.request.uri}"
+ if strings.Contains(path, uriPlaceholder) {
+ tmpUri := r.URL.Path
+ if r.URL.RawQuery != "" {
+ tmpUri += "?" + r.URL.RawQuery
+ }
+ path = strings.ReplaceAll(path, uriPlaceholder, tmpUri)
+ }
+
newPath = repl.ReplaceAll(path, "")
}