2016-04-03 11 views
7

Tôi đang sử dụng Golang trong chương trình phụ trợ. Khi tôi hiển thị html bằng html/templates, tôi nhận được ZgotmplZ cho URL.Làm cách nào để loại bỏ ZgotmplZ khỏi html/template trong Golang?

{{if .UserData.GitURL}} 
<li> 
    <a href="{{.UserData.GitURL}}"> 
    <i class="icon fa fa-github"></i> 
    </a> 
</li> 
{{end}} 

Tôi đang sử dụng chuỗi cho GitURL ở phía máy chủ. URL này là https. Khi tôi tìm kiếm giải pháp, một số blog được đề xuất sử dụng safeURL. Vì vậy, tôi đã thử,

{{if .UserData.GitURL}} 
<li> 
    <a href="{{.UserData.GitURL | safeURL}}"> 
    <i class="icon fa fa-github"></i> 
    </a> 
</li> 
{{end}} 

Nhưng mã không biên dịch.

Ai đó có thể giúp tôi với điều này? Bất kỳ đề nghị nào sẽ thực sự hữu ích.

+0

Đảm bảo chuỗi url là chính xác. Ví dụ, nó sẽ xuất ra 'ZgotmplZ' nếu có 'https:' với dấu cách phía trước thay vì 'https:' –

+3

Có thể trùng lặp của [Tại sao tôi thấy ZgotmplZ trong đầu ra mẫu HTML Go của tôi?] (Https: // stackoverflow .com/questions/14765395/why-am-i-see-zgotmplz-in-my-go-html-mẫu-đầu ra) – Carpetsmoker

Trả lời

6

ZgotmplZ là giá trị đặc biệt cho biết thông tin nhập của bạn không hợp lệ. Trích dẫn từ doc của 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:...`). 

Nếu bạn muốn thay thế một url văn bản hợp lệ, không có gì đặc biệt như như safeURL chức năng là cần thiết. Nếu việc thực thi mẫu của bạn dẫn đến giá trị như "#ZgotmplZ", điều đó có nghĩa là URL bạn muốn chèn không hợp lệ.

Xem ví dụ này:

t := template.Must(template.New("").Parse(`<a href="{{.}}"></a>` + "\n")) 
t.Execute(os.Stdout, "http://google.com") 
t.Execute(os.Stdout, "badhttp://google.com") 

Output:

<a href="http://google.com"></a> 
<a href="#ZgotmplZ"></a> 

Bạn có thể sử dụng một giá trị kiểu template.URL nếu bạn muốn sử dụng một URL như nó vốn có mà không thoát. Lưu ý rằng trong trường hợp này giá trị được cung cấp sẽ được sử dụng như-ngay cả khi nó không phải là một URL hợp lệ.

safeURL không phải là một loại ma thuật hoặc chức năng được khai báo trước mà bạn có thể sử dụng trong các mẫu. Nhưng bạn có thể đăng ký chức năng tùy chỉnh của riêng bạn mà trả về một tham số string url là một giá trị kiểu 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") 

Output:

<a href="http://google.com"></a> 
<a href="badhttp://google.com"></a> 

Lưu ý: Nếu bạn có thể vượt qua trong một template.URL giá trị trực tiếp cho việc thực thi mẫu, bạn không cần đăng ký và sử dụng chức năng tùy chỉnh safeURL():

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")) 

Output:

<a href="http://google.com"></a> 
<a href="badhttp://google.com"></a> 

Hãy thử những trên Go Playground.

Các vấn đề liên quan