Golang中如何使用URLs处理html/template的图片链接href和img src

Golang中如何使用URLs处理html/template的图片链接href和img src 我尝试在gohtml模板中为href和img src使用URL,但无法显示图片(即<img src="#ZgotmplZ" alt="">)。因此,我尝试通过实现一个SafeURL函数来使用template.URL,但现在整个页面基本上只得到一个空的div。SafeURL函数没有被访问到。然而,我的另一个函数IsMultiple却正常工作。我在SafeURL函数上做错了什么?

var funcMap = template.FuncMap{"isMultiple": IsMultiple, "safeURL": SafeURL}
func IsMultiple(index, divisor int) bool {
	return index%divisor == 0
}

func SafeURL(url string) template.URL {
	return template.URL(url)
}
	pageTemplateMaster := template.New(pageFullName[1])
	_, err := pageTemplateMaster.Funcs(funcMap).ParseFiles(append([]string{pageFullPath}, layoutsFullPaths...)...)
	if err != nil {
		return pageTemplateMaster, err
	}
{{ $carModels := index .Data "carModels" }}
{{ range $i, $carModel := $carModels }}
    {{ if (isMultiple $i 2) }}
        <div class="row gv-3 align-items-center mb-100 mb-lg-0">
			<div class="col-12 col-lg-6 show-on-scroll" data-show-duration="500" data-show-distance="20" data-show-origin="left" data-show-delay="250">
			    <a href="{{.ImageHref|safeURL}}" class="gallery-item gallery-item-lg" data-fancybox="gallery-1" data-animation-effect="fade">
			        <img src="{{.ImageSrc|safeURL}}" alt="">
			    </a>
			</div>
        </div>
    {{else}}
        <div class="row gv-3 align-items-center mb-100 mb-lg-0">
            <div class="col-12 col-lg-6 order-lg-3 show-on-scroll" data-show-duration="500" data-show-distance="20" data-show-origin="right" data-show-delay="250">
                <a href="{{.ImageHref|safeURL}}" class="gallery-item gallery-item-lg" data-fancybox="gallery-1" data-animation-effect="fade">
                    <img src="{{.ImageSrc|safeURL}}" alt="">
                </a>
            </div>
        </div>
    {{end}}

更多关于Golang中如何使用URLs处理html/template的图片链接href和img src的实战教程也可以访问 https://www.itying.com/category-94-b0.html

4 回复

哦,这真是个细微的错误。很高兴听到你发现并修复了它。

更多关于Golang中如何使用URLs处理html/template的图片链接href和img src的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


SafeURL() 似乎不是问题的根源,它在这个测试代码中运行良好。

你能将你的代码精简到一个仍能复现该问题的最小示例吗?

感谢您的回复。我找到了问题所在。URL 是以 sql.NullString 类型而非 string 类型传递给模板的。因此,解决方案很简单,就是将 .ImageHref.ImageSrc 改为 .ImageHref.String.ImageSrc.String。这样修改后,即使不使用 safeURL 也能正常工作,所以我不确定是否有必要保留它。

在Go的html/template包中,URL需要特殊处理以防止XSS攻击。你遇到的问题是因为template.URL类型需要正确使用。以下是解决方案:

// 修正SafeURL函数
func SafeURL(url string) template.URL {
    return template.URL(url)
}

// 确保在模板中正确注册函数
var funcMap = template.FuncMap{
    "isMultiple": IsMultiple,
    "safeURL":    SafeURL,
}

问题可能出现在模板解析或数据传递上。检查以下几点:

  1. 确保数据字段存在且正确
// 传递给模板的数据结构示例
type CarModel struct {
    ImageSrc  string
    ImageHref string
}

type PageData struct {
    Data map[string]interface{}
}

// 使用示例
data := PageData{
    Data: map[string]interface{}{
        "carModels": []CarModel{
            {
                ImageSrc:  "/images/car1.jpg",
                ImageHref: "/gallery/car1.jpg",
            },
        },
    },
}
  1. 完整的模板执行示例
func renderTemplate(w http.ResponseWriter, tmpl *template.Template, data interface{}) {
    err := tmpl.Execute(w, data)
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
    }
}

// 在HTTP处理函数中使用
func handler(w http.ResponseWriter, r *http.Request) {
    tmpl := template.New("page").Funcs(funcMap)
    tmpl, err := tmpl.ParseFiles("template.html", "layout.html")
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
    
    data := PageData{
        Data: map[string]interface{}{
            "carModels": []CarModel{
                {ImageSrc: "/static/images/car1.jpg", ImageHref: "/gallery/car1.jpg"},
                {ImageSrc: "/static/images/car2.jpg", ImageHref: "/gallery/car2.jpg"},
            },
        },
    }
    
    renderTemplate(w, tmpl, data)
}
  1. 调试SafeURL函数是否被调用
func SafeURL(url string) template.URL {
    // 添加日志调试
    log.Printf("SafeURL called with: %s", url)
    return template.URL(url)
}
  1. 检查模板解析顺序
// 确保Funcs在ParseFiles之前调用
pageTemplateMaster := template.New(pageFullName[1]).Funcs(funcMap)
_, err := pageTemplateMaster.ParseFiles(append([]string{pageFullPath}, layoutsFullPaths...)...)
if err != nil {
    return pageTemplateMaster, err
}

如果SafeURL函数仍然没有被调用,可能是模板解析问题。尝试简化模板进行测试:

<!-- 测试模板 -->
{{ $test := "https://example.com/image.jpg" }}
<img src="{{ $test | safeURL }}" alt="test">

确保传递给模板的数据中ImageSrcImageHref字段是字符串类型,并且不为空。#ZgotmplZ通常表示模板引擎对不安全内容进行了转义,使用template.URL类型应该能解决这个问题。

回到顶部