I am trying to create some custom error pages but can't seem to get the 500 one working.
I have the following config:
server {
listen 80;
root /var/www/devsite;
index index.php;
server_name devsite;
error_page 403 = /error.php?code=403;
error_page 404 = /error.php?code=404;
error_page 500 = /error.php?code=500;
location / {
try_files $uri =404;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
}
}
At first, I thought it might be because it's a PHP file so I changed:
error_page 500 = /error.php?code=500;
To a static page:
error_page 500 /500.html
But it still just shows a blank page with a 500 response code when I break some PHP code to trigger it.
I then tried to make it the last rule inside location ~ \.php$
but the same happens. Any ideas why the custom 500 page won't work?
I also notice that if you try to access an "access denied" file that has the .php extension, it will not show the custom 403 page and show the built-in page instead. Is there a way to make the rule cover .php files too?
The piece you're missing is the
fastcgi_intercept_errors
directive. Without this directive, Nginx won't touch responses from CGI backends, so long as they are valid:You need to put the following in your PHP handling location:
As an aside, you may not need the
=
in your error_page lines (depending on your intended use). This syntax instructs Nginx to use the response code returned from the PHP script you're pointing to instead of the original response code: