nginx (php-fpm) 下 404 PHP 页面的根路径不起作用



如果我试图访问站点根目录中不存在的任何内容,即。http://example.com/unexisting.php,我使用以下配置从我的自定义404页面得到了正确的好答案:

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;
}

如果我试图访问根文件夹之外的文件,即"http://example.com/unexisting_dir/unexisting.php",404页面在屏幕上,但没有任何图形。因为日志中有类似"GET/unexpisting_dir/images/some_image_for_404_page.png HTTP/1.1"的内容,nginx什么都不返回,因为它从用户请求中有一个错误的基。同时,我检查了$document_root是否有正确的基,所以php-fpm运行得很好。

问题是如何让nginx在为404页面提供未存在的嵌套(嵌入)目录服务的情况下忽略用户的URI(而不会重定向和损害任何潜在的东西)

非常感谢!

这是"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;
    fastcgi_param  REDIRECT_STATUS    200;
    fastcgi_pass unix:/var/run/php5-fpm.sock;

这里的问题不是nginx。它正确地返回not_found.php 的输出

您需要确保输出包含图像的绝对路径,而不是HTML中的相对路径。例如

<img src="/notfound.jpg" />

代替

<img src="notfound.jpg" />

额外的正斜杠告诉浏览器从文档根而不是浏览器请求的当前"目录"请求图像。

最新更新