2016-05-02 16 views
2

URLを使ってHTMLテンプレートをレンダリングしようとしています。問題はURLにcontains()が含まれていて、それらの文字がエスケープされていることです。htmlテンプレートの自動エスケープを避ける

私は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> 

答えて

0

template.URLの値を使用すると、完全に十分です。あなたが見る何

が与えられたURLのない HTMLエンコーディングです、あなたが見るもの(data)部分でURLの開口部のエンコードと閉じ括弧です。それは完全に大丈夫です。 %28'('(28は開始括弧の文字のためのヘキサコード)のエンコードで、%29')'です。

URL http://myurl.com/(data)/aaa.jpghttp://myurl.com/%28data%29/aaa.jpgは1と同じです。 URL(例えば、フォームパラメータ)に含まれるURLと値を安全に送信することができるように

URL符号化の目的です。

URLエンコーディング

URLは唯一のASCII文字セットを使用してインターネット経由で送信することができます。

URLは、多くの場合、ASCII文字セット以外の文字が含まれているので、URLが有効なASCII形式に変換する必要があります。

URLエンコードは2桁の16進数に続く「%」で危険なASCII文字を置き換えます。 URLにはスペースを使用できません。通常、URLエンコードは、スペースをプラス(+)記号または%20で置き換えます。

URLエンコードの詳細については、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枚の画像が表示されます。

+0

http:// myurl.com /%28data%29/aaa.jpgはアクセスできず、404は応答できません。http://myurl.com/(data)/ aaa.jpgはjpgを表示しますファイル。 –

+0

あなたのテストはうまくいくが、イメージは '/(data)/ aaa.jpg'に送られる。しかし、URL全体を(CDNのものであるため)テンプレートに渡す必要があります。そして、不思議なことに、 '%28'と'%29'は '('と ')'として理解できません... –

+0

@Jérômehtmlページには2つのイメージがあり、2番目にはソース属性 'src =" http: //localhost:8080/%28data%29/aaa.jpg "(つまりカッコがエンコードされている)、これも機能し、2番目の画像も表示されます。 – icza

関連する問題