ref: e2a28114d196689337fea8a78f250c7ef706b4be
parent: 4f17ad69a74af4c00e9415cf436b66b521b0e990
author: Ross Lawley <[email protected]>
date: Fri Aug 9 17:35:23 EDT 2013
Add redirect to page parameters and redirects example
--- a/docs/content/doc/front-matter.md
+++ b/docs/content/doc/front-matter.md
@@ -4,8 +4,8 @@
+++
The front matter is one of the features that gives Hugo it's strength. It enables
-you to include the meta data of the content right with it. Hugo supports a few
-different formats each with their own identifying tokens.
+you to include the meta data of the content right with it. Hugo supports a few
+different formats each with their own identifying tokens.
Supported formats: <br>
**YAML**, identified by '\-\-\-'. <br>
@@ -24,7 +24,7 @@
- "VIM"
slug: "spf13-vim-3-0-release-and-new-website"
---
- Content of the file goes Here
+ Content of the file goes Here
### TOML Example
@@ -39,7 +39,7 @@
]
slug = "spf13-vim-3-0-release-and-new-website"
+++
- Content of the file goes Here
+ Content of the file goes Here
### JSON Example
@@ -54,7 +54,7 @@
],
"slug": "spf13-vim-3-0-release-and-new-website",
}
- Content of the file goes Here
+ Content of the file goes Here
### Variables
@@ -71,6 +71,7 @@
#### Optional
+**redirect** Mark the post as a redirect post<br>
**draft** If true the content will not be rendered unless `hugo` is called with -d<br>
**type** The type of the content (will be derived from the directory automatically if unset).<br>
**markup** (Experimental) Specify "rst" for reStructuredText (requires
--- /dev/null
+++ b/docs/content/doc/redirects.md
@@ -1,0 +1,37 @@
+---
+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
--- /dev/null
+++ b/docs/content/redirects/my-awesome-blog-post.md
@@ -1,0 +1,5 @@
+---
+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,6 +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 class="divider"></li>
<li class="nav-header">Meta</li>
<li> <a href="/doc/release-notes">Release Notes</a></li>
--- /dev/null
+++ b/docs/layouts/redirects/single.html
@@ -1,0 +1,8 @@
+<!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
@@ -42,6 +42,7 @@
RenderedContent *bytes.Buffer
contentType string
Draft bool
+ Redirect bool
Tmpl *template.Template
Markup string
PageMeta
@@ -85,7 +86,6 @@
page.Params = make(map[string]interface{})
page.Keywords = make([]string, 10, 30)
page.Markup = "md"
- page.setSection()
return page
}
@@ -92,8 +92,16 @@
func (p *Page) setSection() {
x := strings.Split(p.FileName, string(os.PathSeparator))
+ section := x[len(x)-2]
- if section := x[len(x)-2]; section != "content" {
+ 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
}
}
@@ -102,7 +110,7 @@
if page.contentType != "" {
return page.contentType
}
-
+ page.setSection()
if x := page.GetSection(); x != "" {
return x
}
@@ -130,6 +138,7 @@
// TODO initalize separately... load from reader (file, or []byte)
func NewPage(filename string) *Page {
p := initializePage(filename)
+
if err := p.buildPageFromFile(); err != nil {
fmt.Println(err)
os.Exit(1)
@@ -299,6 +308,8 @@
page.layout = interfaceToString(v)
case "markup":
page.Markup = interfaceToString(v)
+ case "redirect":
+ page.Redirect = interfaceToBool(v)
case "status":
page.Status = interfaceToString(v)
default: