nginx set 如何使用变量+文本

根据$uri是否是/结尾,拼接相应文本,最后返回相应的文件

location / {
      set $t $uri".html";
      if ($uri ~ /$) {
         set $t $uri'index.html';
      }
      
      root /var/tmp/xxx;
      try_files $t =404;
}

就是不知如何在set中使用变量+文本.

当然如果有其他方法实现该需求也可以推荐一下.

阅读 12.4k
1 个回答
    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
        }
    }
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进