模板操作

Caddy的模板功能使得可以在静态站点中添加动态内容,也能通过包含页面减少重复内容。很多指令都支持模板操作,比如templatesbrowsemarkdown

模板操作只被支持它们的指令才能起作用。可以查阅文档检查你的指令是否支持模板,以及应该如何使用。Caddy的模板使用Go的text/template中的语法。使用text/template将帮助你体验模板的所有优势,不过对于并非程序员的我们,只需要一些简单的指令。Caddy还提供一些额外的有用的函数帮助模板网页的使用,我们在这里列举出来。

基本语法

模板操作被包含在{{}}标记中间。模板单词是大小写敏感的。

常用函数

包含其他文件

  1. {{.Include "path/to/file.html"}} // 没有参数
  2. {{.Include "path/to/file.html" "arg1" 2 "value 3"}} // 带参数

在被包含文件内获取参数

  1. {{index .Args 0}} // 0表示第一个参数,以此类推

包含和渲染一个文件(不需要markdown中间件)

  1. {{.Markdown "path/to/file.md"}}

显示当前时间戳(格式)

  1. {{.Now "Monday, 2 Jan 2006"}}

获取Cookie值

  1. {{.Cookie "name"}}

HEADER头的值

  1. {{.Header "name"}}

访问者IP

  1. {{.IP}}

服务器IP

  1. {{.ServerIP}}

访问者主机名 (需要进行DNS查询,可能慢)

  1. {{.Hostname}}

请求URI

  1. {{.URI}}

请求主机

  1. {{.Host}}

请求端口

  1. {{.Port}}

请求方法

  1. {{.Method}}

请求路径是否匹配另一个路径

  1. {{.PathMatches "/some/path"}}

网址的一部分

  1. {{.URL.RawQuery}}

RawQuery返回查询字符串。你还可以把RawQuery换成HostSchemeFragmentString或者Query.Get “参数”等.

环境变量

  1. {{.Env.ENV_VAR_NAME}}

将值截取一定长度(从开始或者结尾)

  1. {{.Truncate "value" 3}} // "val"
  2. {{.Truncate "value" -3}} // "lue"

字符串替换

  1. {{.Replace "haystack" "needle" "replacement"}}

当前日期/时间对象(日期相关的函数中非常有用)

  1. {{.NowDate}}

获取路径的后缀

  1. {{.Ext "path/filename.ext"}}

去掉文件名的后缀

  1. {{.StripExt "filename.ext"}}

去掉HTML保留纯文本

  1. {{.StripHTML "Shows <b>only</b> text content"}}

字符串小写

  1. {{.ToLower "Makes Me ONLY lowercase"}}

字符串大写

  1. {{.ToUpper "Makes me only UPPERCASE"}}

分割字符串

  1. {{.Split "123-456-7890" "-"}}

将系列值变成切片(数组)

  1. {{.Slice "a" "b" "c"}}

把键和值匹配(在advanced cases,有子模板等是有用)

  1. {{.Map "key1" "value1" "key2" "value2"}}

列举目录中的文件

  1. {{.Files "sub/directory"}}
  2. {{.Context.Files "sub/directory"}} // markdown的模板里边需要加上前缀.Context

是否有可能HTTPS拦截

  1. {{.IsMITM}}

生成最小和最大值间长度的字符串

  1. {{.RandomString 100 10000}}

内置清理函数

这些函数内置在text/template,但是你可能会发现他们很有用。

  • 让HTML安全(转移特殊字符)
  1. {{html "Makes it <i>safe</i> to render as HTML"}}
  • 让JavaScript安全
  1. {{js "Makes content safe for use in JS"}}
  • 让URL安全(编码查询内容)
  1. {{urlquery "Makes safe for URL query strings"}}

控制语句

  • If
  1. {{if .PathMatches "/secret/sauce"}}
  2. Only for secret sauce pages
  3. {{end}}
  • If-else
  1. {{if .PathMatches "/secret/sauce"}}
  2. Only for secret sauce pages
  3. {{else}}
  4. No secret sauce for you
  5. {{end}}

If-elseif-else

  1. {{if .PathMatches "/secret/sauce"}}
  2. Only for secret sauce pages
  3. {{else if eq .URL "/banana.html"}}
  4. You're on the banana page
  5. {{else}}
  6. No bananas or secret sauce
  7. {{end}}
  • Range: (迭代数据; 这个例子用来打印头信息)
  1. {{range $field, $val := .Req.Header}}
  2. {{$field}}: {{$val}}
  3. {{end}}
  • 服务端注释
  1. {{/* This isn't sent to the client */}}

比较函数

if表达式中,你可以使用比较函数:

  • eq 等于
  • ne 不等于
  • it 小于
  • le 小于或等于
  • gt 大于
  • ge 大于或等于

或者一些逻辑表达式

  • not 反转if条件
  • or 返回第一个非空参数或者最后一个参数
  • and 返回第一个空参数或者最后一个参数

进一步阅读

这里只列举了一部分你可以使用的例子。如果你需要更多的模板功能,可以通过查阅text/template包了解更多细节。