mirror of
				https://github.com/caddyserver/caddy.git
				synced 2025-11-03 19:17:29 -05:00 
			
		
		
		
	After reading a question about the `handle_response` feature of `reverse_proxy`, I realized that we didn't have a way of serving an arbitrary file with a status code other than 200. This is an issue in situations where you want to serve a custom error page in routes that are not errors, like the aforementioned `handle_response`, where you may want to retain the status code returned by the proxy but write a response with content from a file. This feature is super simple, basically if a status code is configured (can be a status code number, or a placeholder string) then that status will be written out before serving the file - if we write the status code first, then the stdlib won't write its own (only the first HTTP status header wins).
		
			
				
	
	
		
			112 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			112 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
localhost
 | 
						|
 | 
						|
root * /srv
 | 
						|
 | 
						|
handle /nope* {
 | 
						|
	file_server {
 | 
						|
		status 403
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
handle /custom-status* {
 | 
						|
	file_server {
 | 
						|
		status {env.CUSTOM_STATUS}
 | 
						|
	}
 | 
						|
}
 | 
						|
----------
 | 
						|
{
 | 
						|
	"apps": {
 | 
						|
		"http": {
 | 
						|
			"servers": {
 | 
						|
				"srv0": {
 | 
						|
					"listen": [
 | 
						|
						":443"
 | 
						|
					],
 | 
						|
					"routes": [
 | 
						|
						{
 | 
						|
							"match": [
 | 
						|
								{
 | 
						|
									"host": [
 | 
						|
										"localhost"
 | 
						|
									]
 | 
						|
								}
 | 
						|
							],
 | 
						|
							"handle": [
 | 
						|
								{
 | 
						|
									"handler": "subroute",
 | 
						|
									"routes": [
 | 
						|
										{
 | 
						|
											"handle": [
 | 
						|
												{
 | 
						|
													"handler": "vars",
 | 
						|
													"root": "/srv"
 | 
						|
												}
 | 
						|
											]
 | 
						|
										},
 | 
						|
										{
 | 
						|
											"group": "group2",
 | 
						|
											"handle": [
 | 
						|
												{
 | 
						|
													"handler": "subroute",
 | 
						|
													"routes": [
 | 
						|
														{
 | 
						|
															"handle": [
 | 
						|
																{
 | 
						|
																	"handler": "file_server",
 | 
						|
																	"hide": [
 | 
						|
																		"./Caddyfile"
 | 
						|
																	],
 | 
						|
																	"status_code": "{env.CUSTOM_STATUS}"
 | 
						|
																}
 | 
						|
															]
 | 
						|
														}
 | 
						|
													]
 | 
						|
												}
 | 
						|
											],
 | 
						|
											"match": [
 | 
						|
												{
 | 
						|
													"path": [
 | 
						|
														"/custom-status*"
 | 
						|
													]
 | 
						|
												}
 | 
						|
											]
 | 
						|
										},
 | 
						|
										{
 | 
						|
											"group": "group2",
 | 
						|
											"handle": [
 | 
						|
												{
 | 
						|
													"handler": "subroute",
 | 
						|
													"routes": [
 | 
						|
														{
 | 
						|
															"handle": [
 | 
						|
																{
 | 
						|
																	"handler": "file_server",
 | 
						|
																	"hide": [
 | 
						|
																		"./Caddyfile"
 | 
						|
																	],
 | 
						|
																	"status_code": 403
 | 
						|
																}
 | 
						|
															]
 | 
						|
														}
 | 
						|
													]
 | 
						|
												}
 | 
						|
											],
 | 
						|
											"match": [
 | 
						|
												{
 | 
						|
													"path": [
 | 
						|
														"/nope*"
 | 
						|
													]
 | 
						|
												}
 | 
						|
											]
 | 
						|
										}
 | 
						|
									]
 | 
						|
								}
 | 
						|
							],
 | 
						|
							"terminal": true
 | 
						|
						}
 | 
						|
					]
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
} |