gddo-server: account for vendor dirs in pkg.go.dev redirect

Pkg.go.dev does not support documentation for vendor directories.
When showing the corresponding pkg.go.dev link in the header or
when automatically redirecting, change the destination to be the
pkg.go.dev homepage instead of a vendor link that will 404.

Fixes golang/go#38671

Change-Id: Ic7d221d3cc7fef352f5c7097a667fb8dd2ad0340
Reviewed-on: https://go-review.googlesource.com/c/gddo/+/233839
Run-TryBot: Andrew Bonventre <andybons@golang.org>
Reviewed-by: Julie Qiu <julie@golang.org>
diff --git a/gddo-server/assets/templates/importers.html b/gddo-server/assets/templates/importers.html
index 87c8c05..06c4cec 100644
--- a/gddo-server/assets/templates/importers.html
+++ b/gddo-server/assets/templates/importers.html
@@ -7,5 +7,5 @@
 {{end}}
 
 {{define "PkgGoDevLink"}}
-  <a href="https://pkg.go.dev{{if .pdoc.ImportPath}}/{{.pdoc.ImportPath}}{{end}}?tab=importedby">pkg.go.dev{{if .pdoc.ImportPath}}/{{.pdoc.ImportPath}}?tab=importedby{{end}}</a>
+  <a href="https://pkg.go.dev{{if .pdoc.ImportPath}}{{if notVendorPath .pdoc.ImportPath}}/{{.pdoc.ImportPath}}?tab=importedby{{end}}{{end}}">pkg.go.dev{{if .pdoc.ImportPath}}{{if notVendorPath .pdoc.ImportPath}}/{{.pdoc.ImportPath}}?tab=importedby{{end}}{{end}}</a>
 {{end}}
diff --git a/gddo-server/assets/templates/imports.html b/gddo-server/assets/templates/imports.html
index 3204a9e..7cc8f2d 100644
--- a/gddo-server/assets/templates/imports.html
+++ b/gddo-server/assets/templates/imports.html
@@ -7,5 +7,5 @@
 {{end}}
 
 {{define "PkgGoDevLink"}}
-  <a href="https://pkg.go.dev{{if .pdoc.ImportPath}}/{{.pdoc.ImportPath}}{{end}}?tab=imports">pkg.go.dev{{if .pdoc.ImportPath}}/{{.pdoc.ImportPath}}?tab=imports{{end}}</a>
+  <a href="https://pkg.go.dev{{if .pdoc.ImportPath}}{{if notVendorPath .pdoc.ImportPath}}/{{.pdoc.ImportPath}}?tab=imports{{end}}{{end}}">pkg.go.dev{{if .pdoc.ImportPath}}{{if notVendorPath .pdoc.ImportPath}}/{{.pdoc.ImportPath}}?tab=imports{{end}}{{end}}</a>
 {{end}}
diff --git a/gddo-server/main.go b/gddo-server/main.go
index 9ffb342..dc1d843 100644
--- a/gddo-server/main.go
+++ b/gddo-server/main.go
@@ -1171,6 +1171,12 @@
 	u := &url.URL{Scheme: "https", Host: pkgGoDevHost}
 	q := url.Values{"utm_source": []string{"godoc"}}
 
+	if strings.Contains(godocURL.Path, "/vendor/") || strings.HasSuffix(godocURL.Path, "/vendor") {
+		u.Path = "/"
+		u.RawQuery = q.Encode()
+		return u
+	}
+
 	switch godocURL.Path {
 	case "/-/go":
 		u.Path = "/std"
diff --git a/gddo-server/main_test.go b/gddo-server/main_test.go
index 28f53a4..a68d363 100644
--- a/gddo-server/main_test.go
+++ b/gddo-server/main_test.go
@@ -151,6 +151,14 @@
 			from: "https://godoc.org/cloud.google.com/go/storage?importers",
 			to:   "https://pkg.go.dev/cloud.google.com/go/storage?tab=importedby&utm_source=godoc",
 		},
+		{
+			from: "https://godoc.org/golang.org/x/vgo/vendor/cmd/go/internal/modfile",
+			to:   "https://pkg.go.dev/?utm_source=godoc",
+		},
+		{
+			from: "https://godoc.org/golang.org/x/vgo/vendor",
+			to:   "https://pkg.go.dev/?utm_source=godoc",
+		},
 	}
 
 	for _, tc := range testCases {
diff --git a/gddo-server/template.go b/gddo-server/template.go
index 501525f..7b2a6c8 100644
--- a/gddo-server/template.go
+++ b/gddo-server/template.go
@@ -521,7 +521,7 @@
 
 const pkgGoDevLinkTmpl = `
 {{define "PkgGoDevLink"}}
-  <a href="https://pkg.go.dev{{if .pdoc.ImportPath}}/{{.pdoc.ImportPath}}{{end}}">pkg.go.dev{{if .pdoc.ImportPath}}/{{.pdoc.ImportPath}}{{end}}</a>
+  <a href="https://pkg.go.dev{{if .pdoc.ImportPath}}{{if notVendorPath .pdoc.ImportPath}}/{{.pdoc.ImportPath}}{{end}}{{end}}">pkg.go.dev{{if .pdoc.ImportPath}}{{if notVendorPath .pdoc.ImportPath}}/{{.pdoc.ImportPath}}{{end}}{{end}}</a>
 {{end}}
 `
 
@@ -559,6 +559,7 @@
 		"relativePath":      relativePathFn,
 		"sidebarEnabled":    func() bool { return v.GetBool(ConfigSidebar) },
 		"staticPath":        func(p string) string { return cb.AppendQueryParam(p, "v") },
+		"notVendorPath":     func(p string) bool { return !strings.Contains(p, "/vendor") },
 	}
 	for _, set := range htmlSets {
 		templateName := set[0]