{"id":13724266,"url":"https://github.com/tampajohn/goprerender","last_synced_at":"2026-01-12T02:54:01.283Z","repository":{"id":26492479,"uuid":"29944728","full_name":"tampajohn/goprerender","owner":"tampajohn","description":"Prerender.io golang middleware","archived":false,"fork":false,"pushed_at":"2021-07-20T13:50:23.000Z","size":17,"stargazers_count":55,"open_issues_count":1,"forks_count":14,"subscribers_count":1,"default_branch":"master","last_synced_at":"2024-11-02T20:52:14.570Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tampajohn.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2015-01-28T01:38:39.000Z","updated_at":"2024-07-09T09:48:56.000Z","dependencies_parsed_at":"2022-07-08T04:28:28.707Z","dependency_job_id":null,"html_url":"https://github.com/tampajohn/goprerender","commit_stats":null,"previous_names":["tampajohn/prerender"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tampajohn%2Fgoprerender","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tampajohn%2Fgoprerender/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tampajohn%2Fgoprerender/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tampajohn%2Fgoprerender/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tampajohn","download_url":"https://codeload.github.com/tampajohn/goprerender/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":224628469,"owners_count":17343344,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-08-03T01:01:53.117Z","updated_at":"2026-01-12T02:54:01.275Z","avatar_url":"https://github.com/tampajohn.png","language":"Go","funding_links":[],"categories":["Go"],"sub_categories":[],"readme":"Prerender Go\n===========================\n\nBots are constantly hitting your site, and a lot of times they're unable to render\njavascript.  Prerender.io is awesome, and allows a headless browser to render you\npage.  \n\nThis middleware allows you to intercept requests from crawlers and route them\nto an external Prerender Service to retrieve the static HTML for the requested page.\n\nPrerender adheres to google's `_escaped_fragment_` proposal, which we recommend you use. It's easy:\n- Just add \u0026lt;meta name=\"fragment\" content=\"!\"\u003e to the \u0026lt;head\u003e of all of your pages\n- If you use hash urls (#), change them to the hash-bang (#!)\n- That's it! Perfect SEO on javascript pages.\n\n## Features\nI tried to replicate the features found in the [Prerender-node](https://github.com/prerender/prerender-node/)\nmiddleware.\n\n## Using it in [negroni](https://github.com/codegangsta/negroni)\n``` go\npackage main\n\nimport (\n  \"net/http\"\n\n  \"github.com/codegangsta/negroni\"\n  \"github.com/tampajohn/prerender\"\n  )\n\n  func main() {\n    n := negroni.New()\n    n.Use(negroni.NewLogger())\n    n.Use(prerender.NewOptions().NewPrerender())\n    n.Use(negroni.NewStatic(http.Dir(\".\")))\n    n.Run(\":80\")\n  }\n\n\n```\n... or if you want to use a custom prerender server\n\n``` go\npackage main\n\nimport (\n  \"net/http\"\n  \"net/url\"\n\n  \"github.com/codegangsta/negroni\"\n  \"github.com/tampajohn/prerender\"\n  )\n\n  func main() {\n    n := negroni.New()\n    n.Use(negroni.NewLogger())\n    o := prerender.NewOptions()\n    o.PrerenderURL, _ = url.Parse(\"http://prerender.powerchord.io/\")\n    n.Use(o.NewPrerender())\n    n.Use(negroni.NewStatic(http.Dir(\".\")))\n    n.Run(\":80\")\n  }\n\n\n  ```\n  ... or if you want to use it without negroni\n  ``` go\n  package main\n\n  import (\n    \"net/http\"\n\n    \"github.com/tampajohn/prerender\"\n    )\n\n    func main() {\n      m := http.NewServeMux()\n      m.HandleFunc(\"/\", prerender.NewOptions().NewPrerender().PreRenderHandler)\n      http.ListenAndServe(\":80\", m)\n    }\n\n\n```\n\n... or if you want to use it on a single page application\n  ``` go\n  package main\n  \n  import (\n  \t\"net/http\"\n  \t\"net/url\"\n  \t\"os\"\n  \t\"path/filepath\"\n  \n  \t\"github.com/codegangsta/negroni\"\n  \t\"github.com/tampajohn/prerender\"\n  \t\"github.com/gorilla/mux\"\n  )\n  \n  type spaHandler struct {\n  \tstaticPath string\n  \tindexPath  string\n  }\n  \n  func (h spaHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {\n  \tpath, err := filepath.Abs(r.URL.Path)\n  \tif err != nil {\n  \t\thttp.Error(w, err.Error(), http.StatusBadRequest)\n  \t\treturn\n  \t}\n  \n  \tpath = filepath.Join(h.staticPath, path)\n  \n  \t_, err = os.Stat(path)\n  \tif os.IsNotExist(err) {\n  \t\thttp.ServeFile(w, r, filepath.Join(h.staticPath, h.indexPath))\n  \t\treturn\n  \t} else if err != nil {\n  \t\thttp.Error(w, err.Error(), http.StatusInternalServerError)\n  \t\treturn\n  \t}\n  \n  \thttp.FileServer(http.Dir(h.staticPath)).ServeHTTP(w, r)\n  }\n  func main() {\n  \tn := negroni.New()\n  \tn.Use(negroni.NewLogger())\n  \tn.Use(prerender.NewOptions().NewPrerender())\n  \tr := mux.NewRouter()\n  \tspa := spaHandler{staticPath: \"src\", indexPath: \"index.html\"}\n  \tr.PathPrefix(\"/\").Handler(spa)\n  \tn.UseHandler(r)\n  \tn.Run(\":8099\")\n  }\n\n\n\n```\n\n### Special Thanks\nI stole almost all of the logic from prerender-node (thanks prerender guys :))\n\nI also want to thank [CodeGangsta](https://github.com/codegangsta) for creating\nNegroni and making it so freaking awesome to use.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftampajohn%2Fgoprerender","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftampajohn%2Fgoprerender","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftampajohn%2Fgoprerender/lists"}