你好,我是赵兴晨,97年文科程序员。
今天咱们来聊一聊Nginx的try_files指令,你知道这个指令是干什么的吗?
如果你对Web服务器配置有所了解,那么你可能会对try_files指令感到好奇。这个指令实际上是Nginx配置中的一项强大功能,它能够按顺序检测文件或目录是否存在。当文件或目录不存在时,Nginx会执行内部重定向到一个指定的回退URI。
检测文件是否存在
在Nginx的配置文件中,try_files指令允许我们定义一个文件列表,Nginx会按照这个列表的顺序去查找文件。例如,它可能首先查找原始的URI,然后是该RUI的.html版本,接着是URI对应的目录下的index.html文件。如果所有这些尝试都失败了,Nginx将重定向到我们的回退URI。
重要的是要注意,只有列表中的最后一个参数能够触发内部重定向,而其他参数仅用于设置内部URI的指向。此外,最后一个参数指定的回退URI必须存在,否则Nginx将返回一个内部500的错误。
通过这种方式,try_files指令不仅提高了Web服务器的领会行,还增强了用户体验,因为它允许我们优雅地处理不存在的文件请求。
语法格式:
try_files指令的基本语法如下:
try_files file ... uri;
try_files file ... =code;
- file:需要检查的文件或目录路径。
- uri:如果所有文件都不存在,将重定向到这个RUI。
- code:如果指定文件不存在,返回自定义的状态码。
应用场景示例:
假设我们希望当用户访问不存在的页面时,自动跳转到 default.html 页面。我们可以这样配置:
location / {root /data/nginx/html/pc;index index.html;try_files $uri $uri.html $uri/index.html /about/default.html;
}
在上面👆例子中,如果用户请求的URI对应的文件不存在,Nginx将尝试查找$uri.html 或 $uri/index.html。如果这些文件也不存在,Nginx将重定向到 /about/default/html。
自定义状态码:
我们还可以通过设置 try_files的最后一个参数为等于某个状态码,来自定义返回的状态码。例如:
try_files $uri $uri/index.html $uri.html =489;
这样配置后,当用户访问不存在的URI时,Nginx将返回状态码489。
测试与验证
为了验证配置是否生效,我们可以执行以下操作:
1、向 /data/nginx/html/pc/about/default.html 文件中添加一些内容。
mkdir -p /data/nginx/html/pc/about
echo "this is default! " > /data/nginx/html/pc/about/default.html
2、重启Nginx服务。
systemctl restart nginx
3、访问一个不存在的URI,如 http://chensir.ink/about/xx.html,观察是否显示 default.html 的内容。
补充知识点:
使用 curl 命令时,可用过 -I 选项来发送HRAD请求,这样 curl 会只读文档的头部信息,而不是整个文档。这样可以帮助您查看返回的HTTP状态码。
4、注释掉 default.html的重定向,启用自定义状态码489的配置,再次访问不存在的URI,观察返回的状态码是否为489。
server {listen 80;location / {root /data/nginx/html/pc;index index.html;try_files $uri $uri.html $uri/index.html $uri.html =489;}
}
状态码是489,跟咱们预想的一样。
通过这些步骤,我们可以确保Nginx的try_files指令按照预期工作,为用户提供更加友好和灵活的访问体验。
OK,今天的分享就到这啦,感谢您的阅读。我们下期再见!