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

nginx中使用try_files时,是否有一种方法可以在try_files指令中指定每个URI之后才指定和使用自定义的error_page?

以下configuration不起作用:

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

但是在上面的例子中,如果每个条目都被尝试过,但是仍然没有find,它会返回默认的404错误页面,但是我希望它返回一个自定义的页面。

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

总而言之,如果指定了error_page指令,则try_files不会经过条目链。

有两个问题,你正在做什么:

  • if块的行为不像你想的那样
  • 任何404响应不太可能源自您的location /

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

您的location /块的最后一个操作是调用指定位置@redirect_store 。 如果生成了404响应,则在处理离开location /块后可能会发生。 因此,只有在location /块的范围内声明的error_page指令将被忽略(不pipe上面提到的if块的问题)。

error_page文档的最后一行指出:

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

这意味着你的保护性陈述是不必要的。

试试这个:

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