Golang html/template模板如何让<br/>标签正常渲染不被转义
问题原因
Go标准库的html/template包默认会对所有字符串类型的变量做HTML转义,避免XSS注入风险,所以你写入的<br/>标签会被转义为<br/>实体字符,浏览器只会原样输出不会解析为换行。你之前使用template.HTMLEscapeString处理内容的操作反而会进一步加剧转义效果,自然无法达到预期。
解决方案
按你的使用场景可以选择两种方案:
场景1:你完全确定Body内容无恶意代码(无用户输入内容)
直接将需要渲染HTML标签的字段类型改为template.HTML即可,模板不会对该类型的内容做转义处理。
修改示例:
- 结构体定义修改:
type Page struct { // 其他字段保持不变 Body template.HTML // 从string类型改为template.HTML类型 } // 赋值时直接转成template.HTML类型 page.Body = template.HTML("Some text.<br/>More text")
你提供的复现代码对应修改Data结构体即可:
type Data struct { Field1 template.HTML Field2 template.HTML Field3 template.HTML } // 赋值时转类型 data.Field1 = template.HTML("Some text<br/>More text")
场景2:Body包含用户输入的内容,需要避免XSS风险
推荐自定义模板函数nl2br,先对原始内容做HTML转义,再将换行符\n替换为<br/>标签,既保证安全又能实现换行效果:
- 首先定义转换函数:
import "strings" func nl2br(s string) template.HTML { // 先转义所有HTML特殊字符,避免XSS注入 escaped := template.HTMLEscapeString(s) // 替换换行符为br标签 return template.HTML(strings.ReplaceAll(escaped, "\n", "<br/>")) }
- 解析模板前注册自定义函数:
var err error // 先注册函数,再解析模板 tmpl, err = template.New("").Funcs(template.FuncMap{ "nl2br": nl2br, }).ParseGlob("views/*")
- 模板中调用函数即可:
<div>{{nl2br .Body}}</div>
这种方式不需要手动拼接<br/>标签,原始字符串里的\n会自动转换为可生效的换行标签,安全性更高。
内容的提问来源于stack exchange,提问作者pigfox
相关产品推荐
相关产品推荐

