避免在html模板中自动转义

时间:2016-05-02 10:16:41

标签: go go-html-template

尝试使用URL呈现HTML模板。问题是URL中包含(),并且这些字符被转义。

我尝试使用template.URL("http://myurl.com/(data)/aaa.jpg")template.HTML("http://myurl.com/(data)/aaa.jpg"),但仍然会使用括号。

我正在使用gin gonic

router.GET("/test", func(c *gin.Context) {
    c.HTML(http.StatusOK, "test.tmpl", gin.H{
        "url": template.URL("http://myurl.com/(data)/aaa.jpg"),
        // "url": template.HTML("http://myurl.com/(data)/aaa.jpg"),
})

模板文件:

<div>
  <img src="{{.url}}" />
</div>

最终输出:

<div>
  <img src="http://myurl.com/%28data%29/aaa.jpg"/>
</div>

1 个答案:

答案 0 :(得分:0)

使用值template.URL就足够了。

您看到的是给定网址的HTML编码,您看到的是(data)部分中的左右括号的网址编码。那是完全可以的。 %28'('的编码(28是左括号字符的六进制代码),%29')'字符。

网址http://myurl.com/(data)/aaa.jpghttp://myurl.com/%28data%29/aaa.jpg是同一个。

URL编码的目的是使URL中包含的URL和值(例如表单参数)可以安全地传输。

  

网址编码

     

只能使用ASCII字符集通过Internet发送URL。

     

由于URL通常包含ASCII集之外的字符,因此必须将URL转换为有效的ASCII格式。

     

URL编码用“%”后跟两个十六进制数字替换不安全的ASCII字符。   网址不能包含空格。 URL编码通常用加号(+)或%20替换空格。

您可以在此处详细了解网址编码:HTML URL Encoding Reference

测试它:

func rh(w http.ResponseWriter, r *http.Request) {
    fmt.Fprint(w, `<html><body>
<img src="http://localhost:8080/(data)/aaa.jpg">
<img src="http://localhost:8080/%28data%29/aaa.jpg">
</body></htm>`)
}

func imgh(w http.ResponseWriter, r *http.Request) {
    http.ServeFile(w, r, "aaa.jpg")
}

func main() {
    http.HandleFunc("/", rh)
    http.HandleFunc("/(data)/aaa.jpg", imgh)
    panic(http.ListenAndServe("localhost:8080", nil))
}

现在将您的浏览器定向到http://localhost:8080。它将显示2张图像。