nginx set 如何使用变量+文本

查看:418
本文介绍了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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆