@marcel91200 / caddy Mirror · read-only / commits / b1a456cf
Fork 0

Fast and extensible multi-platform HTTP/1-2-3 web server with automatic HTTPS

Mirrored from https://github.com/Slazee/caddy.git

Synced Nov 14, 05:15 UTC

rewrite: strip_prefix, strip_suffix, and uri_replace dirs (closes #2906)

Matthew Holt committed Dec 12, 2019 at 15:46 UTC b1a456cfe38e83eedb778032ed6739e7e3cbe8a4
2 files changed +95 -3
caddyconfig/httpcaddyfile/directives.go
+3
@@ -27,6 +27,9 @@ import (
27 // to apply directives in HTTP routes.
28 var defaultDirectiveOrder = []string{
29 "rewrite",
30 + "strip_prefix",
31 + "strip_suffix",
32 + "uri_replace",
33 "try_files",
34 "basicauth",
35 "headers",
modules/caddyhttp/rewrite/caddyfile.go
+92 -3
@@ -15,20 +15,25 @@
15 package rewrite
16
17 import (
18 + "strconv"
19 +
20 "github.com/caddyserver/caddy/v2/caddyconfig/httpcaddyfile"
21 "github.com/caddyserver/caddy/v2/modules/caddyhttp"
22 )
23
24 func init() {
23 - httpcaddyfile.RegisterHandlerDirective("rewrite", parseCaddyfile)
25 + httpcaddyfile.RegisterHandlerDirective("rewrite", parseCaddyfileRewrite)
26 + httpcaddyfile.RegisterHandlerDirective("strip_prefix", parseCaddyfileStripPrefix)
27 + httpcaddyfile.RegisterHandlerDirective("strip_suffix", parseCaddyfileStripSuffix)
28 + httpcaddyfile.RegisterHandlerDirective("uri_replace", parseCaddyfileURIReplace)
29 }
30
26 -// parseCaddyfile sets up the handler from Caddyfile tokens. Syntax:
31 +// parseCaddyfileRewrite sets up a basic rewrite handler from Caddyfile tokens. Syntax:
32 //
33 // rewrite [<matcher>] <to>
34 //
35 // The <to> parameter becomes the new URI.
31 -func parseCaddyfile(h httpcaddyfile.Helper) (caddyhttp.MiddlewareHandler, error) {
36 +func parseCaddyfileRewrite(h httpcaddyfile.Helper) (caddyhttp.MiddlewareHandler, error) {
37 var rewr Rewrite
38 for h.Next() {
39 if !h.NextArg() {
@@ -42,3 +47,87 @@ func parseCaddyfile(h httpcaddyfile.Helper) (caddyhttp.MiddlewareHandler, error)
47 rewr.Rehandle = true
48 return rewr, nil
49 }
50 +
51 +// parseCaddyfileStripPrefix sets up a handler from Caddyfile tokens. Syntax:
52 +//
53 +// strip_prefix [<matcher>] <prefix>
54 +//
55 +// The request path will be stripped its prefix if it matches <prefix>.
56 +func parseCaddyfileStripPrefix(h httpcaddyfile.Helper) (caddyhttp.MiddlewareHandler, error) {
57 + var rewr Rewrite
58 + for h.Next() {
59 + if !h.NextArg() {
60 + return nil, h.ArgErr()
61 + }
62 + rewr.StripPathPrefix = h.Val()
63 + if h.NextArg() {
64 + return nil, h.ArgErr()
65 + }
66 + }
67 + return rewr, nil
68 +}
69 +
70 +// parseCaddyfileStripSuffix sets up a handler from Caddyfile tokens. Syntax:
71 +//
72 +// strip_suffix [<matcher>] <suffix>
73 +//
74 +// The request path will be stripped its suffix if it matches <suffix>.
75 +func parseCaddyfileStripSuffix(h httpcaddyfile.Helper) (caddyhttp.MiddlewareHandler, error) {
76 + var rewr Rewrite
77 + for h.Next() {
78 + if !h.NextArg() {
79 + return nil, h.ArgErr()
80 + }
81 + rewr.StripPathSuffix = h.Val()
82 + if h.NextArg() {
83 + return nil, h.ArgErr()
84 + }
85 + }
86 + return rewr, nil
87 +}
88 +
89 +// parseCaddyfileURIReplace sets up a handler from Caddyfile tokens. Syntax:
90 +//
91 +// uri_replace [<matcher>] <find> <replace> [<limit>]
92 +//
93 +// Substring replacements will be performed on the request URI up to the
94 +// number specified by limit, if any (default = 0, or no limit).
95 +func parseCaddyfileURIReplace(h httpcaddyfile.Helper) (caddyhttp.MiddlewareHandler, error) {
96 + var rewr Rewrite
97 +
98 + var repls []replacer
99 +
100 + for h.Next() {
101 + args := h.RemainingArgs()
102 + var find, replace, lim string
103 + switch len(args) {
104 + case 3:
105 + lim = args[2]
106 + fallthrough
107 + case 2:
108 + find = args[0]
109 + replace = args[1]
110 + default:
111 + return nil, h.ArgErr()
112 + }
113 +
114 + var limInt int
115 + if lim != "" {
116 + var err error
117 + limInt, err = strconv.Atoi(lim)
118 + if err != nil {
119 + return nil, h.Errf("limit must be an integer; invalid: %v", err)
120 + }
121 + }
122 +
123 + repls = append(repls, replacer{
124 + Find: find,
125 + Replace: replace,
126 + Limit: limInt,
127 + })
128 + }
129 +
130 + rewr.URISubstring = repls
131 +
132 + return rewr, nil
133 +}