If I try to access anything unexisting in the site's root directory, ie http://example.com/unexisting.php , I get right good answer from my custom 404 page using the following config:
server_name example.com;
root /path/to/example;
index index.php;
error_page 404 /not_found.php;
location ~ index\.php
{
try_files $uri/index.php =404;
return 301 $scheme://$server_name/;
}
location ~ not_found\.php
{
root /path/to/example;
allow all;
internal;
fastcgi_intercept_errors off;
fastcgi_param SCRIPT_FILENAME $document_root/not_found.php;
include fastcgi_params;
}
location = /
{
try_files $uri/index.php @static;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
include fastcgi_params;
}
location ~ \.php$
{
try_files $uri $uri/ =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_intercept_errors on;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location @static
{
try_files $uri $uri/ =404;
expires max;
}
location /
{
try_files /something_non_existing @static;
}
If I try to access files out the root folder, ie " http://example.com/unexisting_dir/unexisting.php ", the 404 page is on the screen, but without any graphics. Because in logs are things like "GET /unexisting_dir/images/some_image_for_404_page.png HTTP/1.1" and nginx returns nothing, 'cause it has a wrong base from the user request. Meanwhile, I've checked that $document_root has the right base, so php-fpm works perfect.
The question is how to make nginx ignore user's URI in case of servicing 404 page for unexisting nested (embedded) directories (without redirecting and harming anything potential) ?
Many thanks in advance!
This is "fastcgi_params" (just in case):
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_param REDIRECT_STATUS 200;
fastcgi_pass unix:/var/run/php5-fpm.sock;
The issue here is not nginx. It is correctly returning the output of not_found.php
You need to ensure that the output includes absolute paths to your images instead of relative in the HTML. Eg
<img src="/notfound.jpg" />
Instead of
<img src="notfound.jpg" />
The extra forward slash tells the browser to request the images from the document root instead of the current "directory" that the browser has requested.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.