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