nginx set 如何使用变量+文本
本文介绍了nginx set 如何使用变量+文本的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
问 题
根据$uri
是否是/
结尾,拼接相应文本,最后返回相应的文件
location / {
set $t $uri".html";
if ($uri ~ /$) {
set $t $uri'index.html';
}
root /var/tmp/xxx;
try_files $t =404;
}
就是不知如何在set中使用变量+文本.
当然如果有其他方法实现该需求也可以推荐一下.
解决方案
location / {
set $t "${uri}.html";
if ($uri ~ /$) {
set $t "${uri}index.html";
}
root /var/tmp/xxx;
try_files $t =404;
}
不过又出现另一个问题:$uri
是/
结尾时,比如/a/
且文件/var/tmp/xxx/a/index.html
也存在,但nginx却返回了404.
原因是try_files受index directive的影响:
// $uri是目录
status:=0
for _,v:=range $index{
if IsFile($uri+v){ // true
$uri=$uri+v // 这也是try_files的第一个值通常是$uri的原因,因为该文件肯定存在,上面返回404就是该原因.
status=404
n:=len($try_files)
for j,vv:=range $try_files{
if j==n-1{
goto Location # nginx内部重定向
}
if IsFile(strings.TrimRight(vv,"/")){
status = 200
break
}
}
}else{
if IsDir(strings.TrimRight($uri,"/")){
status=403
continue
}else{ // No such file or directory
status=404
break
}
}
}
这篇关于nginx set 如何使用变量+文本的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文