URL rewriting for Craft CMS 3

1. My Caddy version:

v2.0.0-beta9 h1:oILdAOfunJ4ijBN9kOWjFIeH8EufBX/N1pC9HbnwjzU=

2. How I run Caddy:

Run binary downloaded from Github at the terminal for now.

a. System environment:

Linux, Ubuntu 18.04

b. Command:

caddy2 run --config Caddyfile2 --adapter caddyfile

d. My complete Caddyfile:

http://sitename.localhost
tls off
root * /path/to/project/web
encode gzip
php_fastcgi unix//run/php/php7.3-fpm.sock
try_files index.php?p={path}&{query}
file_server

3. The problem I’m having:

URLs that don’t lead to actual files result in the home page being served rather than whatever page was requested.

I’m running Craft CMS 3 (PHP), and the rewrite directive that worked for Caddy 1 is:

rewrite {
	to {path} {path}/ /index.php?p={path}&{query} /index.php?{query}
}

These are the Apache rewrite rules:

    # Send would-be 404 requests to Craft
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} !^/(favicon\.ico|apple-touch-icon.*\.png)$ [NC]
    RewriteRule (.+) index.php?p=$1 [QSA,L]

5. What I already tried:

A

Instead of my try_files directive, I’ve tried:

rewrite * /index.php?p={path}&{query}

This results in http.log.error too many rehandles in Craft’s output.


B

php_fastcgi unix//run/php/php7.3-fpm.sock
matcher craftPages {
	path /blog
}
rewrite match:craftPages /index.php?p={path}&{query}
file_server

This enables the blog page /blog to load properly (yay!), but I need to achieve the same for dynamic paths.


C

I’ve also tried using reverse_proxy with a modified version of what the documentation states php_fastcgi does, but this only gives me 404s for what should be PHP-served pages.

# canonicalize URI trailing slash when index file present
matcher indexFiles {
	not {
		path */
	}
	file {
		try_files {path}/index.php
	}
}
redir match:indexFiles {path}/

# internally rewrite directory URIs to index.php files
# try_files {path} {path}/index.php index.php
try_files {path} /index.php?p={path}&{query} /index.php?{query}

# proxy any requests for PHP files to backend via FastCGI
matcher phpFiles {
	path *.php
}
reverse_proxy match:phpFiles unix//run/php/php7.3-fpm.sock {
	transport fastcgi {
		split .php
	}
}

6. Links to relevant resources:

https://caddyserver.com/v1/docs/rewrite

https://github.com/caddyserver/caddy/wiki/v2:-Documentation#php_fastcgi

https://github.com/caddyserver/caddy/wiki/v2:-Documentation#rewrite


I’ll continue to use Caddy 1 for now. Thanks in advance for any guidance you’re able to provide!

Hi @BrightEyesD,

I’d have thought that C would be correct here.

Perhaps @matt or @francislavoie might cast an eye over this one and venture a possible cause for this issue.

I’ve tried to create a simple test case.

v2.0 beta 9

/m/projects/site/project/web/test.php (shows PHP Variables):

<?php phpinfo(32); ?>

The Caddyfile is below, with comments listing results of requesting this URL:

http://www.example.localhost/blog

http://www.example.localhost
tls off
root * /m/projects/site/project/web

# Only one of the three try_files uncommented at a time
try_files /test.php?p={path}&{query}  # 404 status: 'File not found.'
try_files /test.php?                  # 404 status: 'File not found.'
try_files /test.php                   # shows PHP Variables page

reverse_proxy {
	to unix//run/php/php7.3-fpm.sock
	transport fastcgi {
		split .php
	}
}

Am I right in thinking that all three try_files should show the test.php PHP Variables page, as processed and output by PHP? Does adding the ? to the filename result in Caddy looking for a file literally named test.php??

As an aside, I came across this while experimenting: when requesting http://www.example.localhost/?p=1 with try_files /test.php? or try_files /test.php?p={path}&{query} (but not with try_files /test.php) uncommented I get the following:

Error
2019/11/18 10:34:34.672 INFO    http.log.access received request        {"request": {"method": "GET", "uri": "/?p=1", "proto": "HTTP/1.1", "remote_addr": "[::1]:42920", "host": "www.example.localhost", "headers": {"Pragma": ["no-cache"], "Cache-Control": ["no-cache"], "User-Agent": ["Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:70.0) Gecko/20100101 Firefox/70.0"], "Accept": ["text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"], "Accept-Encoding": ["gzip, deflate"], "Connection": ["keep-alive"], "Upgrade-Insecure-Requests": ["1"], "Accept-Language": ["en-GB,en;q=0.5"], "Dnt": ["1"]}}, "common_log": "::1 - - [18/Nov/2019:11:34:34 +0100] \"GET /?p=1 HTTP/1.1\" 0 0", "latency": 0.000039485, "size": 0, "status": 0}
2019/11/18 11:34:34 http: panic serving [::1]:42920: runtime error: slice bounds out of range [:3] with length 1
goroutine 113 [running]:
net/http.(*conn).serve.func1(0xc000131220)
        /usr/local/go/src/net/http/server.go:1767 +0x139
panic(0xd5a140, 0xc000274b00)
        /usr/local/go/src/runtime/panic.go:679 +0x1b2
github.com/caddyserver/caddy/v2/modules/caddyhttp/reverseproxy/fastcgi.Transport.buildEnv(0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdd180b,
0x10, ...)
        /Users/matt/Dev/pkg/mod/github.com/caddyserver/caddy/v2@v2.0.0-beta9/modules/caddyhttp/reverseproxy/fastcgi/fastcgi.go:176 +0x196b
github.com/caddyserver/caddy/v2/modules/caddyhttp/reverseproxy/fastcgi.Transport.RoundTrip(0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdd180b, 0x10, ...)
        /Users/matt/Dev/pkg/mod/github.com/caddyserver/caddy/v2@v2.0.0-beta9/modules/caddyhttp/reverseproxy/fastcgi/fastcgi.go:91 +0x7c
github.com/caddyserver/caddy/v2/modules/caddyhttp/reverseproxy.(*Handler).reverseProxy(0xc000276990, 0x7efbfd2300e8, 0xc0002ced80, 0xc0000f1c00, 0xc0001dfdc0, 0xc000274ae0, 0x4, 0xc000274ae5, 0x18, 0x0, ...)
        /Users/matt/Dev/pkg/mod/github.com/caddyserver/caddy/v2@v2.0.0-beta9/modules/caddyhttp/reverseproxy/reverseproxy.go:391 +0x1f0
github.com/caddyserver/caddy/v2/modules/caddyhttp/reverseproxy.(*Handler).ServeHTTP(0xc000276990, 0x7efbfd2300e8, 0xc0002ced80, 0xc0000f1b00, 0xf06260, 0xe05a48, 0x0, 0x0)
        /Users/matt/Dev/pkg/mod/github.com/caddyserver/caddy/v2@v2.0.0-beta9/modules/caddyhttp/reverseproxy/reverseproxy.go:288 +0xaf4
github.com/caddyserver/caddy/v2/modules/caddyhttp.wrapMiddleware.func1.1(0x7efbfd2300e8, 0xc0002ced80, 0xc0000f1b00, 0x0, 0x0)
        /Users/matt/Dev/pkg/mod/github.com/caddyserver/caddy/v2@v2.0.0-beta9/modules/caddyhttp/routes.go:151 +0x62
github.com/caddyserver/caddy/v2/modules/caddyhttp.HandlerFunc.ServeHTTP(0xc00023fd80, 0x7efbfd2300e8, 0xc0002ced80, 0xc0000f1b00, 0xf06260,
0xc00023fd80)
        /Users/matt/Dev/pkg/mod/github.com/caddyserver/caddy/v2@v2.0.0-beta9/modules/caddyhttp/caddyhttp.go:532 +0x44
github.com/caddyserver/caddy/v2/modules/caddyhttp.(*Subroute).ServeHTTP(0xc0002813a0, 0x7efbfd2300e8, 0xc0002ced80, 0xc0000f1b00, 0xf06260,
0xe05a48, 0xffffffffffffffff, 0x0)
        /Users/matt/Dev/pkg/mod/github.com/caddyserver/caddy/v2@v2.0.0-beta9/modules/caddyhttp/subroute.go:71 +0x80
github.com/caddyserver/caddy/v2/modules/caddyhttp.wrapMiddleware.func1.1(0x7efbfd2300e8, 0xc0002ced80, 0xc0000f1b00, 0x152c4f0, 0xc0002da120)
        /Users/matt/Dev/pkg/mod/github.com/caddyserver/caddy/v2@v2.0.0-beta9/modules/caddyhttp/routes.go:151 +0x62
github.com/caddyserver/caddy/v2/modules/caddyhttp.HandlerFunc.ServeHTTP(0xc00023fd20, 0x7efbfd2300e8, 0xc0002ced80, 0xc0000f1b00, 0xc00026ace8, 0xc000134ba0)
        /Users/matt/Dev/pkg/mod/github.com/caddyserver/caddy/v2@v2.0.0-beta9/modules/caddyhttp/caddyhttp.go:532 +0x44
github.com/caddyserver/caddy/v2/modules/caddyhttp.VarsMiddleware.ServeHTTP(0xc0002b0b40, 0x7efbfd2300e8, 0xc0002ced80, 0xc0000f1b00, 0xf06260, 0xc00023fd20, 0x2, 0x0)
        /Users/matt/Dev/pkg/mod/github.com/caddyserver/caddy/v2@v2.0.0-beta9/modules/caddyhttp/vars.go:48 +0x2c0
github.com/caddyserver/caddy/v2/modules/caddyhttp.wrapMiddleware.func1.1(0x7efbfd2300e8, 0xc0002ced80, 0xc0000f1b00, 0x0, 0x0)
        /Users/matt/Dev/pkg/mod/github.com/caddyserver/caddy/v2@v2.0.0-beta9/modules/caddyhttp/routes.go:151 +0x62
github.com/caddyserver/caddy/v2/modules/caddyhttp.HandlerFunc.ServeHTTP(0xc00023fd40, 0x7efbfd2300e8, 0xc0002ced80, 0xc0000f1b00, 0xf06260,
0xc00023fd40)
        /Users/matt/Dev/pkg/mod/github.com/caddyserver/caddy/v2@v2.0.0-beta9/modules/caddyhttp/caddyhttp.go:532 +0x44
github.com/caddyserver/caddy/v2/modules/caddyhttp.(*Subroute).ServeHTTP(0xc000280fa0, 0x7efbfd2300e8, 0xc0002ced80, 0xc0000f1b00, 0xf06260,
0xe05a48, 0xc000375420, 0x0)
        /Users/matt/Dev/pkg/mod/github.com/caddyserver/caddy/v2@v2.0.0-beta9/modules/caddyhttp/subroute.go:71 +0x80
github.com/caddyserver/caddy/v2/modules/caddyhttp.wrapMiddleware.func1.1(0x7efbfd2300e8, 0xc0002ced80, 0xc0000f1b00, 0x0, 0x8)
        /Users/matt/Dev/pkg/mod/github.com/caddyserver/caddy/v2@v2.0.0-beta9/modules/caddyhttp/routes.go:151 +0x62
github.com/caddyserver/caddy/v2/modules/caddyhttp.HandlerFunc.ServeHTTP(0xc00023fc80, 0x7efbfd2300e8, 0xc0002ced80, 0xc0000f1b00, 0x203000,
0x203000)
        /Users/matt/Dev/pkg/mod/github.com/caddyserver/caddy/v2@v2.0.0-beta9/modules/caddyhttp/caddyhttp.go:532 +0x44
github.com/caddyserver/caddy/v2/modules/caddyhttp.(*Server).enforcementHandler(0xc00029e4e0, 0x7efbfd2300e8, 0xc0002ced80, 0xc0000f1b00, 0xf06260, 0xc00023fc80, 0x40caf8, 0x20)
        /Users/matt/Dev/pkg/mod/github.com/caddyserver/caddy/v2@v2.0.0-beta9/modules/caddyhttp/server.go:237 +0x9b
github.com/caddyserver/caddy/v2/modules/caddyhttp.(*Server).wrapPrimaryRoute.func1(0x7efbfd2300e8, 0xc0002ced80, 0xc0000f1b00, 0xd12fa0, 0xc00023fca0)
        /Users/matt/Dev/pkg/mod/github.com/caddyserver/caddy/v2@v2.0.0-beta9/modules/caddyhttp/server.go:213 +0x5a
github.com/caddyserver/caddy/v2/modules/caddyhttp.HandlerFunc.ServeHTTP(0xc00023fca0, 0x7efbfd2300e8, 0xc0002ced80, 0xc0000f1b00, 0xc00023fca0, 0xc00023fc80)
        /Users/matt/Dev/pkg/mod/github.com/caddyserver/caddy/v2@v2.0.0-beta9/modules/caddyhttp/caddyhttp.go:532 +0x44
github.com/caddyserver/caddy/v2/modules/caddyhttp.(*Server).executeCompositeRoute(0xc00029e4e0, 0x7efbfd2300e8, 0xc0002ced80, 0xc0000f1b00,
0xc0002d8000, 0x1, 0x4, 0xc00027e690, 0x0)
        /Users/matt/Dev/pkg/mod/github.com/caddyserver/caddy/v2@v2.0.0-beta9/modules/caddyhttp/server.go:198 +0xff
github.com/caddyserver/caddy/v2/modules/caddyhttp.(*Server).ServeHTTP(0xc00029e4e0, 0x7efbfd2300e8, 0xc0002ced80, 0xc0000f1b00)
        /Users/matt/Dev/pkg/mod/github.com/caddyserver/caddy/v2@v2.0.0-beta9/modules/caddyhttp/server.go:135 +0x73f
net/http.serverHandler.ServeHTTP(0xc00016a380, 0xf159e0, 0xc00001c460, 0xc0000f1900)
        /usr/local/go/src/net/http/server.go:2802 +0xa4
net/http.(*conn).serve(0xc000131220, 0xf186a0, 0xc0002cec40)
        /usr/local/go/src/net/http/server.go:1890 +0x875
created by net/http.(*Server).Serve
        /usr/local/go/src/net/http/server.go:2927 +0x38e

Git commit 9fe54e1c6025a45cdd531c093bb94d193a8b91a0

When compiling from source and trying again, I found that Caddy can’t connect to the PHP socket (it’s still there, and has permissions of 666).

http://www.example.localhost/blog:

2019/11/18 10:45:13.535 ERROR http.log.error dialing backend: dial unix /run/php/php7.3-fpm.sock:0: connect: no such file or directory {“request”: {“method”: “GET”, “uri”: “/blog”, “proto”: “HTTP/1.1”, “remote_addr”: “[::1]:43150”, “host”: “www.example.localhost”, “headers”: {“Accept-Language”: [“en-GB,en;q=0.5”], “Accept-Encoding”: [“gzip, deflate”], “Upgrade-Insecure-Requests”: [“1”], “Pragma”: [“no-cache”], “Cache-Control”: [“no-cache”], “User-Agent”: [“Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:70.0) Gecko/20100101 Firefox/70.0”], “Accept”: [“text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8”], “Dnt”: [“1”], “Connection”: [“keep-alive”]}}, “status”: 502, “err_id”: “5hg5xcs0c”, “err_trace”: “reverseproxy.(*Handler).ServeHTTP (reverseproxy.go:330)”}

A different error when requesting /?p=1, which repeated several times for one request:

http://www.example.localhost/?p=1:

Error
2019/11/18 11:40:58 http: panic serving [::1]:43056: runtime error: slice bounds out of range [:3] with length 1                                                                                                                                                                          
goroutine 22 [running]:                                                                                                                                                                                                                                                                   
net/http.(*conn).serve.func1(0xc0000f30e0)                                                                                                                                                                                                                                                
        /home/david/.asdf/installs/golang/1.13.4/go/src/net/http/server.go:1767 +0x139                                                                                                                                                                                                    
panic(0xda8ca0, 0xc0002dc0c0)                                                                                                                                                                                                                                                             
        /home/david/.asdf/installs/golang/1.13.4/go/src/runtime/panic.go:679 +0x1b2                                                                                                                                                                                                       
github.com/caddyserver/caddy/v2/modules/caddyhttp/reverseproxy/fastcgi.Transport.buildEnv(0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe24ecf, 0x10, ...)                                                                                                                                    
        /home/david/go/caddy/modules/caddyhttp/reverseproxy/fastcgi/fastcgi.go:176 +0x196b                                                                                                                                                                                                
github.com/caddyserver/caddy/v2/modules/caddyhttp/reverseproxy/fastcgi.Transport.RoundTrip(0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe24ecf, 0x10, ...)                                                                                                                                   
        /home/david/go/caddy/modules/caddyhttp/reverseproxy/fastcgi/fastcgi.go:91 +0x7c                                                                                                                                                                                                   
github.com/caddyserver/caddy/v2/modules/caddyhttp/reverseproxy.(*Handler).reverseProxy(0xc00020aaa0, 0xf74260, 0xc0002ec000, 0xc0002da300, 0xc000262600, 0xc0002210a0, 0x4, 0xc0002dc060, 0x1a, 0xc0002210a5, ...)                                                                        
        /home/david/go/caddy/modules/caddyhttp/reverseproxy/reverseproxy.go:409 +0x1f0                                                                                                                                                                                                    
github.com/caddyserver/caddy/v2/modules/caddyhttp/reverseproxy.(*Handler).ServeHTTP(0xc00020aaa0, 0xf74260, 0xc0002ec000, 0xc0002da200, 0xf640c0, 0xe5ae98, 0x0, 0x0)                                                                                                                     
        /home/david/go/caddy/modules/caddyhttp/reverseproxy/reverseproxy.go:314 +0xb30                                                                                                                                                                                                    
github.com/caddyserver/caddy/v2/modules/caddyhttp.wrapMiddleware.func1.1(0xf74260, 0xc0002ec000, 0xc0002da200, 0x0, 0x0)                                                                                                                                                                  
        /home/david/go/caddy/modules/caddyhttp/routes.go:151 +0x62                                                                                                                                                                                                                        
github.com/caddyserver/caddy/v2/modules/caddyhttp.HandlerFunc.ServeHTTP(0xc0002f42c0, 0xf74260, 0xc0002ec000, 0xc0002da200, 0xf640c0, 0xc0002f42c0)                                                                                                                                       
        /home/david/go/caddy/modules/caddyhttp/caddyhttp.go:539 +0x44                                                                                                                                                                                                                     
github.com/caddyserver/caddy/v2/modules/caddyhttp.(*Subroute).ServeHTTP(0xc0002593e0, 0xf74260, 0xc0002ec000, 0xc0002da200, 0xf640c0, 0xe5ae98, 0xffffffffffffffff, 0x0)                                                                                                                  
        /home/david/go/caddy/modules/caddyhttp/subroute.go:71 +0x80                                                                                                                                                                                                                       
github.com/caddyserver/caddy/v2/modules/caddyhttp.wrapMiddleware.func1.1(0xf74260, 0xc0002ec000, 0xc0002da200, 0x15c2cb0, 0xc00025fb00)                                                                                                                                                   
        /home/david/go/caddy/modules/caddyhttp/routes.go:151 +0x62                                                                                                                                                                                                                        
github.com/caddyserver/caddy/v2/modules/caddyhttp.HandlerFunc.ServeHTTP(0xc0002f4260, 0xf74260, 0xc0002ec000, 0xc0002da200, 0xc0002c81a8, 0xc00003ac60)                                                                                                                                   
        /home/david/go/caddy/modules/caddyhttp/caddyhttp.go:539 +0x44                                                                                                                                                                                                                     
github.com/caddyserver/caddy/v2/modules/caddyhttp.VarsMiddleware.ServeHTTP(0xc0002650b0, 0xf74260, 0xc0002ec000, 0xc0002da200, 0xf640c0, 0xc0002f4260, 0x2, 0x0)                                                                                                                          
        /home/david/go/caddy/modules/caddyhttp/vars.go:48 +0x2c0                                                                                                                                                                                                                          
github.com/caddyserver/caddy/v2/modules/caddyhttp.wrapMiddleware.func1.1(0xf74260, 0xc0002ec000, 0xc0002da200, 0x0, 0x0)                                                                                                                                                                  
        /home/david/go/caddy/modules/caddyhttp/routes.go:151 +0x62                                                                                                                                                                                                                        
github.com/caddyserver/caddy/v2/modules/caddyhttp.HandlerFunc.ServeHTTP(0xc0002f4280, 0xf74260, 0xc0002ec000, 0xc0002da200, 0xf640c0, 0xc0002f4280)                                                                                                                                       
        /home/david/go/caddy/modules/caddyhttp/caddyhttp.go:539 +0x44                                                                                                                                                                                                                     
github.com/caddyserver/caddy/v2/modules/caddyhttp.(*Subroute).ServeHTTP(0xc000258fe0, 0xf74260, 0xc0002ec000, 0xc0002da200, 0xf640c0, 0xe5ae98, 0xc0002d1420, 0x0)                                                                                                                        
        /home/david/go/caddy/modules/caddyhttp/subroute.go:71 +0x80                                                                                                                                                                                                                       
github.com/caddyserver/caddy/v2/modules/caddyhttp.wrapMiddleware.func1.1(0xf74260, 0xc0002ec000, 0xc0002da200, 0x0, 0x8)                                                                                                                                                                  
        /home/david/go/caddy/modules/caddyhttp/routes.go:151 +0x62                                                                                                                                                                                                                        
github.com/caddyserver/caddy/v2/modules/caddyhttp.HandlerFunc.ServeHTTP(0xc0002f41e0, 0xf74260, 0xc0002ec000, 0xc0002da200, 0x203000, 0x203000)                                                                                                                                           
        /home/david/go/caddy/modules/caddyhttp/caddyhttp.go:539 +0x44                                                                                                                                                                                                                     
github.com/caddyserver/caddy/v2/modules/caddyhttp.(*Server).enforcementHandler(0xc0002665b0, 0xf74260, 0xc0002ec000, 0xc0002da200, 0xf640c0, 0xc0002f41e0, 0x40e568, 0x20)                                                                                                                
        /home/david/go/caddy/modules/caddyhttp/server.go:238 +0x9b                                                                                                                                                                                                                        
github.com/caddyserver/caddy/v2/modules/caddyhttp.(*Server).wrapPrimaryRoute.func1(0xf74260, 0xc0002ec000, 0xc0002da200, 0xd5f0e0, 0xc0002f4200)                                                                                                                                          
        /home/david/go/caddy/modules/caddyhttp/server.go:214 +0x5a                                                                                                                                                                                                                        
github.com/caddyserver/caddy/v2/modules/caddyhttp.HandlerFunc.ServeHTTP(0xc0002f4200, 0xf74260, 0xc0002ec000, 0xc0002da200, 0xc0002f4200, 0xc0002f41e0)                                                                                                                                   
        /home/david/go/caddy/modules/caddyhttp/caddyhttp.go:539 +0x44                                                                                                                                                                                                                     
github.com/caddyserver/caddy/v2/modules/caddyhttp.(*Server).executeCompositeRoute(0xc0002665b0, 0xf74260, 0xc0002ec000, 0xc0002da200, 0xc00000c1e0, 0x1, 0x4, 0xc0002ba240, 0xc0002d42e8)                                                                                                 
        /home/david/go/caddy/modules/caddyhttp/server.go:199 +0xff                                                                                                                                                                                                                        
github.com/caddyserver/caddy/v2/modules/caddyhttp.(*Server).ServeHTTP(0xc0002665b0, 0xf74260, 0xc0002ec000, 0xc0002da200)                                                                                                                                                                 
        /home/david/go/caddy/modules/caddyhttp/server.go:136 +0x73d                                                                                                                                                                                                                       
net/http.serverHandler.ServeHTTP(0xc000178380, 0xf74260, 0xc0002ec000, 0xc0002da000)
        /home/david/.asdf/installs/golang/1.13.4/go/src/net/http/server.go:2802 +0xa4
net/http.(*conn).serve(0xc0000f30e0, 0xf77120, 0xc0002bc000)
        /home/david/.asdf/installs/golang/1.13.4/go/src/net/http/server.go:1890 +0x875
created by net/http.(*Server).Serve
        /home/david/.asdf/installs/golang/1.13.4/go/src/net/http/server.go:2927 +0x38e

Trying the approach Matt shows here:

matcher notStatic {
	not {
		file {
			try_files {path}
		}
	}
}
try_files /index.php?p={path}&{query}
reverse_proxy match:notStatic {
	to unix//run/php/php7.3-fpm.sock
	transport fastcgi {
		split .php
	}
}
file_server

/blog is 404.

Trying a rewrite:

matcher notStatic {
	not {
		file {
			try_files {path}
		}
	}
}

rewrite match:notStatic /index.php?p={path}&{query}
reverse_proxy match:notStatic {
	to unix//run/php/php7.3-fpm.sock
	transport fastcgi {
		split .php
	}
}
file_server

This sends unprocessed PHP code with a status response of 200:

<?php
/**
 * Craft web bootstrap file
 */

// Set path constants
define('CRAFT_BASE_PATH', dirname(__DIR__));
define('CRAFT_VENDOR_PATH', CRAFT_BASE_PATH.'/vendor');

// Load Composer's autoloader
require_once CRAFT_VENDOR_PATH.'/autoload.php';

// Load dotenv?
if (class_exists('Dotenv\Dotenv') && file_exists(CRAFT_BASE_PATH.'/.env')) {
    (new Dotenv\Dotenv(CRAFT_BASE_PATH))->load();
}

// Load and run Craft
define('CRAFT_ENVIRONMENT', getenv('ENVIRONMENT') ?: 'production');
$app = require CRAFT_VENDOR_PATH.'/craftcms/cms/bootstrap/web.php';
$app->run();

Just curious, how does this work:

Because to the file system, the last two options (/index.php?p={path}&{query} and /index.php?{query}) are indistinguishable - they both go to index.php.

Yes, I since gathered that and so removed the last option.

Ah, okay - thanks for clarifying.

I just realized the v2 try_files doesn’t split a path’s query string off before checking for file existence. In other words, right now, it doesn’t support having query strings (it assumes the entire token text is a filename), but I guess we need those, huh.

2 Likes

@BrightEyesD Before we forget, would you mind filing an issue to request that try_files be smart enough to elide the query string?

Done. :slight_smile:

FYI, this has been implemented in https://github.com/caddyserver/caddy/commit/5e9d81b507e0beb46b3812e21566bfef79c87af4