【问题标题】:Nginx - Customizing 404 pageNginx - 自定义 404 页面
【发布时间】:2010-11-04 16:23:43
【问题描述】:

Nginx+PHP(在 fastCGI 上)非常适合我。当我输入一个不存在的 PHP 文件的路径时,我没有得到默认的 404 错误页面(适用于任何无效的 .html 文件),而是得到一个“未指定输入文件”。

如何自定义这个 404 错误页面?

【问题讨论】:

    标签: php nginx http-status-code-404


    【解决方案1】:

    您可以为 nginx.conf 中的每个位置块设置自定义错误页面,或为整个站点设置全局错误页面。

    要重定向到特定位置的简单 404 未找到页面:

    location /my_blog {
        error_page    404 /blog_article_not_found.html;
    }
    

    站点范围的 404 页面:

    server {
        listen 80;
        error_page  404  /website_page_not_found.html;
        ...
    

    您可以将标准错误代码附加在一起,以便为多种类型的错误提供一个页面:

    location /my_blog {
        error_page 500 502 503 504 /server_error.html
    }
    

    要重定向到完全不同的服务器,假设您在 http 部分中定义了一个名为 server2 的上游服务器:

    upstream server2 {
        server 10.0.0.1:80;
    }
    server {
        location /my_blog {
            error_page    404 @try_server2;
        }
        location @try_server2 {
            proxy_pass http://server2;
        }
    

    manual 可以为您提供更多详细信息,或者您可以在 google 中搜索术语 nginx.conf 和 error_page 以获取网络上的真实示例。

    【讨论】:

    • 你知道是否可以使用错误通配符吗? error_page 50* = /error_50x.html; 之类的东西?
    • 不允许使用通配符 - 此服务器命令的 wiki 页面在这里 wiki.nginx.org/NginxHttpCoreModule#error_page - 它们也不是必需的,因为错误代码是由不经常更改的 HTTP 协议定义的。有关完整列表,请参阅 w3.org/Protocols/rfc2616/rfc2616-sec10.html 或 en.wikipedia.org/wiki/List_of_HTTP_status_codes,如果您认为将来需要代码,我想添加您喜欢的任何数字。
    • 谢谢。目前我有 3 条规则:/403.html、/404.html 和 /5xx.html,它们都共享相同的root,但不知何故,如果我指定位置~ /(?:40[34]|5xx)[.]html$,它将呈现默认的 nginx 错误页面,但是,如果我使用它工作的非正则表达式位置。你知道为什么会这样吗?
    • 这是一个单独的问题,太大了,无法在这些 cmets 中涉及。我会把它变成一个新问题,或者只是添加位置条目。如果你做一个问题的链接,我会看看。
    【解决方案2】:

    您在 nginx config 中使用 error_page 属性。

    例如,如果您打算将 404 错误页面设置为/404.html,请使用

    error_page 404 /404.html;
    

    将 500 错误页面设置为 /500.html 就像这样简单:

    error_page 500 /500.html;
    

    【讨论】:

    • 虽然链接没问题,而且没有链接的情况下答案最低限度,但它可以从额外的阐述中受益。
    • @Paul 我 100% 同意你的观点,因此我在这个答案中添加了一些代码示例 ;-)
    【解决方案3】:

    注意语法! Great Turtle 可以互换使用它们,但是:

    error_page 404 = /404.html;

    将返回状态码为 200 的 404.html 页面(因为 = 已将其转发到此页面)

    error_page 404 /404.html;

    将返回带有(原始)404 错误代码的 404.html 页面。

    https://serverfault.com/questions/295789/nginx-return-correct-headers-with-custom-error-documents

    【讨论】:

    • 这是一个重要的细节!
    • 两年后我更正了我的代码。谢谢 dhr_p。 :)
    【解决方案4】:

    “error_page”参数进行重定向,将请求方式转换为“GET”,不是自定义响应页面。

    最简单的解决方案是

         server{
             root /var/www/html;
             location ~ \.php {
                if (!-f $document_root/$fastcgi_script_name){
                    return 404;
                }
                fastcgi_pass   127.0.0.1:9000;
                include fastcgi_params.default;
                fastcgi_param  SCRIPT_FILENAME  $document_root/$fastcgi_script_name;
            }
    
    

    顺便说一下,如果想让Nginx处理PHP脚本返回的404状态,需要加上

    [fastcgi_intercept_errors][1] on;

    例如

         location ~ \.php {
                #...
                error_page  404   404.html;
                fastcgi_intercept_errors on;
             }
    

    【讨论】:

    • 非常感谢您发布此@Grigori,我也使用您上面的代码解决了我的 nginx 问题
    • 完美,fastcgi_intercept_errors on 正是我想要的。
    • @TheBlackBenzKid 因为它是“请求方法更改为“GET””的重定向,而不是自定义响应,并且请求正文丢失了。
    • 谢谢,我将错误页面目标放置在我的位置块之外。 fastcgi_intercept_errors on 帮助我解决了我的 laravel forge 服务器的自定义 404 页面问题。
    【解决方案5】:

    不再推荐这些答案,因为在这种情况下try_files 的工作速度比if 快。只需在 php 位置块中添加 try_files 即可测试文件是否存在,否则返回 404。

    location ~ \.php {
        try_files $uri =404;
        ...
    }
    

    【讨论】:

    • 这对我帮助很大。我还没有找到任何关于在互联网上使用它的建议。不知道你可以在 try_files 中使用条件。
    猜你喜欢
    • 1970-01-01
    • 2015-08-12
    • 2018-11-16
    • 1970-01-01
    • 2012-10-26
    • 2011-08-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多