Fast and extensible multi-platform HTTP/1-2-3 web server with automatic HTTPS
Mirrored from https://github.com/Slazee/caddy.git
Synced Nov 12, 05:45 UTC
fastcgi: remove dir redirection when useless in php_fastcgi (#6698)
* perf: remove dir redirection when useless in php_fastcgi * fix test * review * fix * fix * simplify * simplify again * restore test * add test
Kévin Dunglas committed
Nov 21, 2024 at 18:38 UTC
eddbccd298f637c4785c891f5f96dbf103580fa8
2 files changed
+134
-24
caddytest/integration/caddyfile_adapt/php_fastcgi_try_files_override_no_dir_index.caddyfiletest
new
+94
@@ -0,0 +1,94 @@
1
+:8884
2
+
3
+php_fastcgi localhost:9000 {
4
+ # some php_fastcgi-specific subdirectives
5
+ split .php .php5
6
+ env VAR1 value1
7
+ env VAR2 value2
8
+ root /var/www
9
+ try_files {path} index.php
10
+ dial_timeout 3s
11
+ read_timeout 10s
12
+ write_timeout 20s
13
+
14
+ # passed through to reverse_proxy (directive order doesn't matter!)
15
+ lb_policy random
16
+}
17
+----------
18
+{
19
+ "apps": {
20
+ "http": {
21
+ "servers": {
22
+ "srv0": {
23
+ "listen": [
24
+ ":8884"
25
+ ],
26
+ "routes": [
27
+ {
28
+ "match": [
29
+ {
30
+ "file": {
31
+ "try_files": [
32
+ "{http.request.uri.path}",
33
+ "index.php"
34
+ ],
35
+ "split_path": [
36
+ ".php",
37
+ ".php5"
38
+ ]
39
+ }
40
+ }
41
+ ],
42
+ "handle": [
43
+ {
44
+ "handler": "rewrite",
45
+ "uri": "{http.matchers.file.relative}"
46
+ }
47
+ ]
48
+ },
49
+ {
50
+ "match": [
51
+ {
52
+ "path": [
53
+ "*.php",
54
+ "*.php5"
55
+ ]
56
+ }
57
+ ],
58
+ "handle": [
59
+ {
60
+ "handler": "reverse_proxy",
61
+ "load_balancing": {
62
+ "selection_policy": {
63
+ "policy": "random"
64
+ }
65
+ },
66
+ "transport": {
67
+ "dial_timeout": 3000000000,
68
+ "env": {
69
+ "VAR1": "value1",
70
+ "VAR2": "value2"
71
+ },
72
+ "protocol": "fastcgi",
73
+ "read_timeout": 10000000000,
74
+ "root": "/var/www",
75
+ "split_path": [
76
+ ".php",
77
+ ".php5"
78
+ ],
79
+ "write_timeout": 20000000000
80
+ },
81
+ "upstreams": [
82
+ {
83
+ "dial": "localhost:9000"
84
+ }
85
+ ]
86
+ }
87
+ ]
88
+ }
89
+ ]
90
+ }
91
+ }
92
+ }
93
+ }
94
+}
modules/caddyhttp/reverseproxy/fastcgi/caddyfile.go
+40
-24
@@ -179,7 +179,7 @@ func parsePHPFastCGI(h httpcaddyfile.Helper) ([]httpcaddyfile.ConfigValue, error
179
indexFile := "index.php"
180
181
// set up for explicitly overriding try_files
182
- tryFiles := []string{}
182
+ var tryFiles []string
183
184
// if the user specified a matcher token, use that
185
// matcher in a route that wraps both of our routes;
@@ -310,31 +310,47 @@ func parsePHPFastCGI(h httpcaddyfile.Helper) ([]httpcaddyfile.ConfigValue, error
310
311
// if the index is turned off, we skip the redirect and try_files
312
if indexFile != "off" {
313
- // route to redirect to canonical path if index PHP file
314
- redirMatcherSet := caddy.ModuleMap{
315
- "file": h.JSON(fileserver.MatchFile{
316
- TryFiles: []string{"{http.request.uri.path}/" + indexFile},
317
- }),
318
- "not": h.JSON(caddyhttp.MatchNot{
319
- MatcherSetsRaw: []caddy.ModuleMap{
320
- {
321
- "path": h.JSON(caddyhttp.MatchPath{"*/"}),
322
- },
323
- },
324
- }),
325
- }
326
- redirHandler := caddyhttp.StaticResponse{
327
- StatusCode: caddyhttp.WeakString(strconv.Itoa(http.StatusPermanentRedirect)),
328
- Headers: http.Header{"Location": []string{"{http.request.orig_uri.path}/"}},
329
- }
330
- redirRoute := caddyhttp.Route{
331
- MatcherSetsRaw: []caddy.ModuleMap{redirMatcherSet},
332
- HandlersRaw: []json.RawMessage{caddyconfig.JSONModuleObject(redirHandler, "handler", "static_response", nil)},
333
- }
313
+ dirRedir := false
314
+ dirIndex := "{http.request.uri.path}/" + indexFile
315
316
// if tryFiles wasn't overridden, use a reasonable default
317
if len(tryFiles) == 0 {
337
- tryFiles = []string{"{http.request.uri.path}", "{http.request.uri.path}/" + indexFile, indexFile}
318
+ tryFiles = []string{"{http.request.uri.path}", dirIndex, indexFile}
319
+ dirRedir = true
320
+ } else {
321
+ for _, tf := range tryFiles {
322
+ if tf == dirIndex {
323
+ dirRedir = true
324
+
325
+ break
326
+ }
327
+ }
328
+ }
329
+
330
+ if dirRedir {
331
+ // route to redirect to canonical path if index PHP file
332
+ redirMatcherSet := caddy.ModuleMap{
333
+ "file": h.JSON(fileserver.MatchFile{
334
+ TryFiles: []string{dirIndex},
335
+ }),
336
+ "not": h.JSON(caddyhttp.MatchNot{
337
+ MatcherSetsRaw: []caddy.ModuleMap{
338
+ {
339
+ "path": h.JSON(caddyhttp.MatchPath{"*/"}),
340
+ },
341
+ },
342
+ }),
343
+ }
344
+ redirHandler := caddyhttp.StaticResponse{
345
+ StatusCode: caddyhttp.WeakString(strconv.Itoa(http.StatusPermanentRedirect)),
346
+ Headers: http.Header{"Location": []string{"{http.request.orig_uri.path}/"}},
347
+ }
348
+ redirRoute := caddyhttp.Route{
349
+ MatcherSetsRaw: []caddy.ModuleMap{redirMatcherSet},
350
+ HandlersRaw: []json.RawMessage{caddyconfig.JSONModuleObject(redirHandler, "handler", "static_response", nil)},
351
+ }
352
+
353
+ routes = append(routes, redirRoute)
354
}
355
356
// route to rewrite to PHP index file
@@ -352,7 +368,7 @@ func parsePHPFastCGI(h httpcaddyfile.Helper) ([]httpcaddyfile.ConfigValue, error
368
HandlersRaw: []json.RawMessage{caddyconfig.JSONModuleObject(rewriteHandler, "handler", "rewrite", nil)},
369
}
370
355
- routes = append(routes, redirRoute, rewriteRoute)
371
+ routes = append(routes, rewriteRoute)
372
}
373
374
// route to actually reverse proxy requests to PHP files;