天天看点

Nginx 配置指令的执行顺序(十一)

    不妨来看下面这个例子:

    不妨先来做一组实验。假设现在 <code>/var/www/</code> 路径下是空的,则第一个参数 <code>/foo</code> 映射成的文件<code>/var/www/foo</code> 是不存在的;同样,对于第二个参数 <code>/bar/</code> 所映射成的目录 <code>/var/www/bar/</code> 也是不存在的。于是此时 Nginx 会在 <code>try-files</code> 阶段发起到最后一个参数所指定的 URI(即 <code>/baz</code>)的“内部跳转”。实际的请求结果证实了这一点:

    对于上面这个请求,Nginx 会产生类似下面这样的“调试日志”:

    接下来再做一组实验:在 <code>/var/www/</code> 下创建一个名为 <code>foo</code> 的文件,其内容为 <code>hello world</code>(注意你需要有<code>/var/www/</code> 目录下的写权限):

然后再请求 <code>/test</code> 接口:

    上面这个请求在 <code>try-files</code> 阶段所产生的“调试日志”如下:

显然,在 <code>try-files</code> 阶段,Nginx 确实只检查和处理了 <code>/foo</code> 这一个参数,而后面的参数都被“短路”掉了。

    类似地,假设我们删除刚才创建的 <code>/var/www/foo</code> 文件,而在 <code>/var/www/</code> 下创建一个名为 <code>bar</code> 的子目录:

则请求 <code>/test</code> 的结果也是类似的:

    这一组实验所产生的“调试日志”如下:

这行配置是说,当 <code>/foo</code> 和 <code>/bar/</code> 参数所对应的文件系统对象都不存在时,就直接返回 <code>404 Not Found</code> 错误页。注意这里它是如何使用等号字符前缀来标识 HTTP 状态码的。

继续阅读