解决nginx的404页面使用SSI时循环嵌套的问题

问题场景:

  1. nginx配置了404页面且指向一个使用了SSI include的页面(例如:404.shtml)
  2. 由于配置等原因,404.shtml中include的内容也不存在(也返回404)

造成结果:
request->404->redirect to 404.shtm->include a 404.shtml->include…
从而导致所有nginx的工作进程都被此请求的死循环block住

解决办法:

参考nginx SSI的文档,利用block语句和include语句中的stub属性:

stub — The name of the block to use as a default if the request is empty or returns an error.

首先在404.shtml中定义一个block:

1
2
3
<!--# block name="file_not_found" -->
SSI Not Found
<!--# endblock -->

然后在需要include的地方使用stub将include出错时的内容指向上面定义的block:

1
<!--#include file="/foobar.shtml" stub="file_not_found"-->