简体   繁体   English

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

[英]Root path for 404 PHP page under nginx (php-fpm) doesn't work

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: 如果我尝试访问该站点的根目录中不存在的任何内容,即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;
}

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. 如果我尝试从根文件夹(即“ http://example.com/unexisting_dir/unexisting.php ”)访问文件,则会在屏幕上显示404页面,但没有任何图形。 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. 因为在日志中出现诸如“ GET /unexisting_dir/images/some_image_for_404_page.png HTTP / 1.1”之类的内容,而nginx却不返回任何内容,因为它来自用户请求的基数错误。 Meanwhile, I've checked that $document_root has the right base, so php-fpm works perfect. 同时,我检查了$ document_root是否具有正确的基础,因此php-fpm可以完美地工作。

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) ? 问题是,在为不存在的嵌套(嵌入)目录提供404页面服务时,如何使nginx忽略用户的URI(而不会重定向和损害任何潜在功能)?

Many thanks in advance! 提前谢谢了!

This is "fastcgi_params" (just in case): 这是“ 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;

The issue here is not nginx. 这里的问题不是nginx。 It is correctly returning the output of not_found.php 它正确返回not_found.php的输出

You need to ensure that the output includes absolute paths to your images instead of relative in the HTML. 您需要确保输出包含图像的绝对路径,而不是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. 额外的正斜杠告诉浏览器从文档根目录请求图像,而不是浏览器已请求的当前“目录”。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM