ref: d5518c09665c474a33bdf3872bde0dcefc0bf572
parent: 45ce6e2b309dc247315885db4de4d03192b93914
author: spf13 <[email protected]>
date: Sat Aug 10 11:35:34 EDT 2013
Adding support for aliases (redirects)
--- /dev/null
+++ b/docs/content/doc/aliases.md
@@ -1,0 +1,33 @@
+---
+title: "Aliases"
+Pubdate: "2013-07-09"
+Aliases:
+ - /doc/redirects/
+ - /doc/alias/
+---
+
+For people migrating existing published content to Hugo theres a good chance
+you need a mechanism to handle redirecting old urls.
+
+Luckily, this can be handled easily with aliases in Hugo.
+
+## Example
+**content/posts/my-awesome-blog-post.md**
+
+ ---
+ aliases:
+ - /posts/my-original-url/
+ - /2010/even-earlier-url.html
+ ---
+
+Now when you go to any of the aliases locations they
+will redirect to the page.
+
+## Important Behaviors
+
+1. *Hugo makes no assumptions about aliases. They also don't change based
+on your UglyUrls setting. You Need to provide a relative path and the
+complete filename or directory.*
+
+2. *Aliases are rendered prior to any content and will be overwritten by
+any content with the same location.*
--- a/docs/content/doc/redirects.md
+++ /dev/null
@@ -1,37 +1,0 @@
----
-title: "Redirects"
-Pubdate: "2013-07-09"
----
-
-For people migrating existing published content to Hugo theres a good chance
-you need a mechanism to handle redirecting old urls.
-
-Luckily, this can be handled easily in a couple of easy steps.
-
-1. Create a special post for the redirect and mark the file as a `redirect`
- file in the front matter. Here is an example
- `content/redirects/my-awesome-blog-post.md` :
-
- ```markdown
- ---
- redirect: true
- slug: /my-awesome-blog-post/
- url: /docs/redirects/
- ---
-```
-
-2. Set the redirect template `layouts/redirects/single.html`:
-
- ```html
- <!DOCTYPE html>
- <html>
- <head>
- <link rel="canonical" href="{{ .Url }}"/>
- <meta http-equiv="content-type" content="text/html; charset=utf-8" />
- <meta http-equiv="refresh" content="0;url={{ .Url }}" />
- </head>
- </html>
- ```
-
-Now when you go to `/my-awesome-blog-post/` it will do a meta redirect to
-`/docs/redirects/`.
\ No newline at end of file
--- a/docs/content/redirects/my-awesome-blog-post.md
+++ /dev/null
@@ -1,5 +1,0 @@
----
-redirect: true
-slug: /my-awesome-blog-post/
-url: /docs/redirects1/
----
\ No newline at end of file
--- a/docs/layouts/chrome/menu.html
+++ b/docs/layouts/chrome/menu.html
@@ -19,7 +19,7 @@
<li class="nav-header">Extras</li>
<li> <a href="/doc/shortcodes">ShortCodes</a></li>
<li> <a href="/doc/indexes">Indexes</a></li>
- <li> <a href="/doc/redirects">Redirects</a></li>
+ <li> <a href="/doc/aliases">Aliases</a></li>
<li class="divider"></li>
<li class="nav-header">Meta</li>
<li> <a href="/doc/release-notes">Release Notes</a></li>
--- a/docs/layouts/redirects/single.html
+++ /dev/null
@@ -1,8 +1,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <link rel="canonical" href="{{ .Url }}"/>
- <meta http-equiv="content-type" content="text/html; charset=utf-8" />
- <meta http-equiv="refresh" content="0;url={{ .Url }}" />
-</head>
-</html>
\ No newline at end of file
--- a/hugolib/page.go
+++ b/hugolib/page.go
@@ -99,21 +99,9 @@
return
}
- //section := x[len(x)-2]
if section := x[len(x)-2]; section != "content" {
p.Section = section
}
-
- //c := p.Site.Config
- //systemDirs := map[string]bool{
- //c.ContentDir: true,
- //c.StaticDir: true,
- //c.LayoutDir: true,
- //}
-
- //if !systemDirs[section] && !p.Redirect {
- //p.Section = section
- //}
}
func (page *Page) Type() string {
--- a/hugolib/site.go
+++ b/hugolib/site.go
@@ -101,6 +101,7 @@
}
func (site *Site) Render() (err error) {
+ site.RenderAliases()
site.ProcessShortcodes()
site.timerStep("render shortcodes")
site.AbsUrlify()
@@ -144,6 +145,12 @@
templates.Funcs(funcMap)
+ s.Tmpl = templates
+ s.primeTemplates()
+ s.loadTemplates()
+}
+
+func (s *Site) loadTemplates() {
walker := func(path string, fi os.FileInfo, err error) error {
if err != nil {
PrintErr("Walker: ", err)
@@ -157,7 +164,7 @@
}
text := string(filetext)
name := path[len(s.Config.GetAbsPath(s.Config.LayoutDir))+1:]
- t := templates.New(name)
+ t := s.Tmpl.New(name)
template.Must(t.Parse(text))
}
return nil
@@ -164,8 +171,13 @@
}
filepath.Walk(s.Config.GetAbsPath(s.Config.LayoutDir), walker)
+}
- s.Tmpl = templates
+func (s *Site) primeTemplates() {
+ alias := "<!DOCTYPE html>\n <html>\n <head>\n <link rel=\"canonical\" href=\"{{ . }}\"/>\n <meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\" />\n <meta http-equiv=\"refresh\" content=\"0;url={{ .Permalink }}\" />\n </head>\n </html>"
+
+ t := s.Tmpl.New("alias")
+ template.Must(t.Parse(alias))
}
func (s *Site) initialize() {
@@ -305,6 +317,22 @@
}
return
+}
+
+func (s *Site) RenderAliases() error {
+ for i, p := range s.Pages {
+ for _, a := range p.Aliases {
+ content, err := s.RenderThing(s.Pages[i], "alias")
+ if strings.HasSuffix(a, "/") {
+ a = a + "index.html"
+ }
+ if err != nil {
+ return err
+ }
+ s.WritePublic(a, content.Bytes())
+ }
+ }
+ return nil
}
func (s *Site) RenderPages() error {