try_files 是nginx0.6.36 后新增一个功能,用于搜索指定目录下的N个文件,如果找不到fileN,则调用fallback中指定的位置来处理请求。个人认为,作为nginx核心的内容,可以部分替代烦琐的rewrite功能,笔者把它用在wp super cache的rewrite重写中,也取得了不错的效果。
try_files
语法: try_files file1 [file2 ... filen] fallback
默认值: 无
作用域: location
这个指令的作用就是可接收多个路径作为参数,当前一个路径的资源无法找到,则自动查找下一个路径,如当请求的静态资源不存在,就将请求fallback指定位置到后台服务器上进行动态处理
现在有这样一个需求,网站根目录下有静态文件,static目录下也有静态文件,static目录下的静态文件是程序批量生成的,我想让nginx在地址不变的前提下优先使用static目录里面的文件,如果不存在再使用根目录下的静态文件,比如访问首页http://example.com/index.html则nginx返回/static/index.html,如果不存在返回/index.html。
经过一番研究可以用if指令实现,关键配置如下,这条配置需要放到靠前的位置
代码如下 | 复制代码 |
if (-e $document_root/static$request_uri) { |
这里有两点需要注意:
1.nginx变量默认应该开头有反斜线而结尾没有。
2.nginx字符串和变量可以直接连接,如果可能有歧义可以花括号括起变量名称,整个字符串必须加双引号
"${document_root}/static${request_uri}"是用这种方式有一个缺点,index指令指定的文件不会起作用,比如访问http://example.com/就会404,必须显示的指定文件名才行http://example.com/index.html。可以用rewrite修复,但是感觉不爽,在nginx陷阱页面突然发现一个针对性的指令try_files
代码如下 | 复制代码 |
set $static "/static"; |
后来发现$uri变量本身会自动添加index.html后缀,经过实验这样写也是可以的
代码如下 | 复制代码 |
if (-e "${document_root}/static${uri}") { if (-e $request_filename) { |
因为最后不存在的文件都写到index.php去了所以上面rewrite之后需要再判断一次文件存在。
例
笔者的博客刚刚建立起来,wp super cache是不可或缺的一个插件,但默认的supercache是针对apache的.htaccess的,在nginx下的
代码如下 | 复制代码 |
|
荒野乱斗国际版 (BrawlStars)最新版本v56.274
下载一波超人内置修改器菜单版 安卓版v1.0.2
下载敢达决战官方正版 安卓版v6.7.9
下载敢达决战 安卓版v6.7.9
下载继承了一座戏园子无限声望铜钱版 内置菜单最新版v1.7
继承了一座戏园子折相思版是游戏的破解版本,在该版本中为玩家提
山河半世橙光清软金手指版 无限鲜花v3.24
山河半世是一款超级好玩的橙光恋爱游戏,在游戏中玩家们需要扮演
蓬莱手游折相思版 安卓版v1.0.0
蓬莱免广告版是游戏的修改版本,在该版本中为玩家去除了广告,玩
当红影后橙光游戏破解版2025 最新版v1.0
当红影后橙光破解版是一款超级好玩的娱乐圈题材的橙光游戏,在这
忽然成了万人迷清软完结版 无限鲜花版v12.15
忽然成了万人迷破解版是一款非常好玩的男性向橙光游戏,在有一天