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
+}