feat: add canonical links to results and details pages
4 files changed, 32 insertions(+), 1 deletion(-)
M internal/components/data.go → internal/components/data.go
@@ -18,6 +18,7 @@ Sources []config.Source Source config.Source Query string ExtraHeadHTML string + CanonicalURL string Code int Message string Title string@@ -102,3 +103,20 @@ nu.RawQuery = q.Encode() return nu.String() } + +func (u SearchNav) WithoutFacets() string { + nu := u.URL + originalQuery := nu.Query() + q := url.Values{} + for _, field := range []string{"query", "page"} { + if originalQuery.Has(field) { + q.Set(field, originalQuery.Get(field)) + } + } + if q.Has("page") && q.Get("page") == "1" { + q.Del("page") + } + nu.RawQuery = q.Encode() + + return nu.String() +}
M internal/components/page.go → internal/components/page.go
@@ -58,6 +58,12 @@ TitleAttr("Searchix "+source.String()), Href(joinPath("/", source.Importer.String(), source.Key, "opensearch.xml")), ) }), + g.Iff(tdata.CanonicalURL != "", func() g.Node { + return Link( + Rel("canonical"), + Href(tdata.CanonicalURL), + ) + }), ), Body( Header(
M internal/components/results.go → internal/components/results.go
@@ -129,6 +129,12 @@ return Li(Class("term"), g.Group(children)) } func ResultsPage(r ResultData) g.Node { + r.CanonicalURL = r.SearchNav.WithoutFacets() + + return SearchPage(r.TemplateData, r, Results(r)) +} + +func DetailResultsPage(r ResultData) g.Node { return SearchPage(r.TemplateData, r, Results(r)) }
M internal/server/source.go → internal/server/source.go
@@ -102,11 +102,12 @@ } else if searchResult, _, searchErr := h.global.ExecuteSearch(h.searchSource(r), r); searchErr == nil && searchResult != nil { searchTitle := searchResult.Title searchResult.Title = h.getTitle(doc) + searchResult.CanonicalURL = "/" + index.GetKey(doc) searchResult.Description = components.MetaDescription(doc) searchResult.DetailContent = components.Detail(doc) searchResult.SearchURL = h.closeURL(r) searchResult.SearchTitle = searchTitle - baseErr = components.ResultsPage(*searchResult).Render(w) + baseErr = components.DetailResultsPage(*searchResult).Render(w) } else { tdata := components.TemplateData{ ExtraHeadHTML: h.global.cfg.Web.ExtraHeadHTML,