模板操作
Caddy的模板功能使得可以在静态站点中添加动态内容,也能通过包含页面减少重复内容。很多指令都支持模板操作,比如templates
、browse
和markdown
。
模板操作只被支持它们的指令才能起作用。可以查阅文档检查你的指令是否支持模板,以及应该如何使用。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.md"}}
显示当前时间戳(格式)
{{.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
换成Host
、Scheme
、Fragment
、String
或者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
包了解更多细节。