I know this has been asked a thousand times, but all the answers that I found simply do not work (for me or usually for the original OP of these questions) ... So, I will try to explain the problem as far as I can, and I hope we can make it work for me and for others who have asked the question before.
My Nginx configuration (with a lot of other unnecessary things removed) looks like this:
http { # Config from here removed server { listen 80; listen 443 ssl; server_name mydomain.co.uk; ssl_certificate /xxxxxxx.crt; ssl_certificate_key /xxxxxxx.key; # Custom error pages root /var/www/viovet_frontend; error_page 404 = /error404.php; # Any simple .php page location ~ \.php$ { root /var/www/xxxxxx; #index index.php index.html; include /etc/nginx/fastcgi.conf; fastcgi_pass phpfastcgiservers; include fastcgi_params; fastcgi_intercept_errors on; } # Lots more config and re-write rules here removed } upstream phpfastcgiservers { server xxxxx1:9001; server xxxxx2:9001; server xxxxx3:9001; fair; } }
All I'm trying to do is get Nginx to catch all 404s and send them back to PHP-FPM via location ~ \.php$ so that the user error page shows up to the user, but I always get the standard Nginx error page.
The following URLs should display the output of mydomain.co.uk/error404.php :
- mydomain.co.uk/someNonExistantFile (does not match any location blocks)
- mydomain.co.uk/someMissingFile.php (corresponds to the location block of the .php file, but the file does not exist)
But they actually show the standard Nginx 404 page. If location ~ \.php$ returns another error code in 404 (for example, 5xx), then we donโt want to interfere, we just return the contents and headers that FastCGI returned first.
I hope this makes sense and that someone can help. Thank you in advance.
EDIT: I tried adding recursive_error_pages on; to the line after # Custom error pages , but this actually leads to the fact that all Nginx 404 Not Found errors become Nginx 500 Internal Server Error errors.
EDIT: Adding Other Files: /etc/nginx/fastcgi.conf
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; fastcgi_param SCRIPT_NAME $fastcgi_script_name; fastcgi_param REQUEST_URI $request_uri; fastcgi_param DOCUMENT_URI $document_uri; fastcgi_param DOCUMENT_ROOT $document_root; fastcgi_param SERVER_PROTOCOL $server_protocol; fastcgi_param HTTPS $https if_not_empty; fastcgi_param GATEWAY_INTERFACE CGI/1.1; fastcgi_param SERVER_SOFTWARE nginx/$nginx_version; fastcgi_param REMOTE_ADDR $remote_addr; fastcgi_param REMOTE_PORT $remote_port; fastcgi_param SERVER_ADDR $server_addr; fastcgi_param SERVER_PORT $server_port; fastcgi_param SERVER_NAME $server_name;
fastcgi_params
fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; fastcgi_param SCRIPT_NAME $fastcgi_script_name; fastcgi_param REQUEST_URI $request_uri; fastcgi_param DOCUMENT_URI $document_uri; fastcgi_param DOCUMENT_ROOT $document_root; fastcgi_param SERVER_PROTOCOL $server_protocol; fastcgi_param HTTPS $https if_not_empty; fastcgi_param GATEWAY_INTERFACE CGI/1.1; fastcgi_param SERVER_SOFTWARE nginx/$nginx_version; fastcgi_param REMOTE_ADDR $remote_addr; fastcgi_param REMOTE_PORT $remote_port; fastcgi_param SERVER_ADDR $server_addr; fastcgi_param SERVER_PORT $server_port; fastcgi_param SERVER_NAME $server_name;
I guess I probably don't need both of them !; -)
Luke cousins
source share