在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块的行为不像你想的那样 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; }