我在后端使用Golang。当我使用html / templates渲染html时,我获得了URL ZgotmplZ
。
{{if .UserData.GitURL}}
<li>
<a href="{{.UserData.GitURL}}">
<i class="icon fa fa-github"></i>
</a>
</li>
{{end}}
我在服务器端使用GitURL字符串。此网址为https
。当我寻找解决方案时,一些博客建议使用safeURL
。所以我试过了,
{{if .UserData.GitURL}}
<li>
<a href="{{.UserData.GitURL | safeURL}}">
<i class="icon fa fa-github"></i>
</a>
</li>
{{end}}
但是代码没有编译。
有人可以帮我吗?任何建议都会非常有用。
答案 0 :(得分:7)
ZgotmplZ
是一个特殊值,表示您的输入无效。引用html/template
的文件:
"ZgotmplZ" is a special value that indicates that unsafe content reached a CSS or URL context at runtime. The output of the example will be <img src="#ZgotmplZ"> If the data comes from a trusted source, use content types to exempt it from filtering: URL(`javascript:...`).
如果您想要替换有效网址文字,则不需要像safeURL
这样的特殊功能。如果您的模板执行结果为"#ZgotmplZ"
,则表示您要插入的网址无效。
见这个例子:
t := template.Must(template.New("").Parse(`<a href="{{.}}"></a>` + "\n"))
t.Execute(os.Stdout, "http://google.com")
t.Execute(os.Stdout, "badhttp://google.com")
输出:
<a href="http://google.com"></a>
<a href="#ZgotmplZ"></a>
如果要在不转义的情况下按原样使用URL,则可以使用类型template.URL
的值。请注意,在这种情况下,即使提供的值不是有效的URL,也会按原样使用提供的值。
safeURL
不是您可以在模板中使用的某种魔术或预先声明的函数。但是您可以注册自己的自定义函数,该函数返回string
url参数作为template.URL
类型的值:
t2 := template.Must(template.New("").Funcs(template.FuncMap{
"safeURL": func(u string) template.URL { return template.URL(u) },
}).Parse(`<a href="{{. | safeURL}}"></a>` + "\n"))
t2.Execute(os.Stdout, "http://google.com")
t2.Execute(os.Stdout, "badhttp://google.com")
输出:
<a href="http://google.com"></a>
<a href="badhttp://google.com"></a>
注意:如果您能够将template.URL
值直接传递给模板执行,则无需注册并使用safeURL()
自定义函数:< / p>
t3 := template.Must(template.New("").Parse(`<a href="{{.}}"></a>` + "\n"))
t3.Execute(os.Stdout, template.URL("http://google.com"))
t3.Execute(os.Stdout, template.URL("badhttp://google.com"))
输出:
<a href="http://google.com"></a>
<a href="badhttp://google.com"></a>
在Go Playground上尝试这些。