使用 nginx try_files 和自定义错误页面作为主要位置块?

使用 nginx try_files 和自定义错误页面作为主要位置块?

在 nginx 中使用 try_files 时,是否有办法仅在尝试了 try_files 指令中指定的每个 URI 之后才指定并使用自定义 error_page?

以下配置不起作用:

location / {   
    if (-f $document_root/error_page.html ) {
        error_page 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 495 496 497 500 501 502 503 504 505 506 507 /error_page.html;
    }
    try_files $uri $uri/ @redirect_store;
}

看起来,如果您使用 error_page 指令,当 nginx 找不到传入的 URI 时,它会立即返回自定义 404 错误页面,而不是尝试 try_files 中的下一个条目。看起来 error_page 指令会覆盖 try_files?

仅当未指定 error_page 指令时,我才能使其工作:

location / {   
    try_files $uri $uri/ @redirect_store;
}

但在上述情况下,如果尝试了每个条目但仍然未找到,它会返回默认的 404 错误页面,但我希望它返回自定义页面。

有人知道如何实现这一点吗,还是不可能?这是 nginx 中的错误吗?我应该能够使用带有 try_files 的自定义 error_page,假设在任何 try_files 条目中都找不到 URI。

总而言之,如果指定了 error_page 指令,try_files 就不会遍历条目链。

答案1

您正在尝试执行的操作存在两个问题:

  • if块的行为不符合您的预期
  • 任何 404 响应不太可能来自您的location /区块内

这个文件解释了为什么该if块只应在非常特殊的情况下使用。

块的最终操作location /是调用命名位置@redirect_store。如果生成任何 404 响应,则很可能在处理离开块之后发生location /。因此,仅在块范围内声明的任何error_page指令location /都将被忽略(无论if上述块问题如何)。

该文件的最后一行error_page指出:

如果 uri 处理导致错误,则将最后发生的错误的状态代码返回给客户端。

这意味着你的保护if声明无论如何都是不必要的。

尝试一下这个:

error_page 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 495 496 497 500 501 502 503 504 505 506 507 /error_page.html;

location / {   
    try_files $uri $uri/ @redirect_store;
}

相关内容