模板操作

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

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

基本语法

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

常用函数

包含其他文件

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

在被包含文件内获取参数

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

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

{{.Markdown "path/to/file.html"}}

显示当前时间戳(格式)

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

获取Cookie值

{{.Cookie "name"}}

HEADER头的值

{{.Header "name"}}

访问者IP

{{.IP}}

服务器IP

{{.ServerIP}}

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

{{.Hostname}}

请求URI

{{.URI}}

请求主机

{{.Host}}

请求端口

{{.Port}}

请求方法

{{.Method}}

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

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

网址的一部分

{{.URL.RawQuery}}

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

环境变量

{{.Env.ENV_VAR_NAME}}

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

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

字符串替换

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

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

{{.NowDate}}

获取路径的后缀

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

去掉文件名的后缀

{{.StripExt "filename.ext"}}

去掉HTML保留纯文本

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

字符串小写

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

字符串大写

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

分割字符串

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

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

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

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

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

列举目录中的文件

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

是否有可能HTTPS拦截

{{.IsMITM}}

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

{{.RandomString 100 10000}}

内置清理函数

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

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

控制语句

  • If
{{if .PathMatches "/secret/sauce"}}
    Only for secret sauce pages
{{end}}
  • If-else
{{if .PathMatches "/secret/sauce"}}
    Only for secret sauce pages
{{else}}
    No secret sauce for you
{{end}}

If-elseif-else

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

比较函数

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

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

或者一些逻辑表达式

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

进一步阅读

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