What is the best approach for redirection of old pages in Jekyll and GitHub Pages? - redirect

I have blog on github pages - jekyll
What is the best way to solve url strategy migration?
I found the best practice in common is create htaccess like so
Redirect 301 /programovani/2010/04/git-co-to-je-a-co-s-tim/ /2010/04/05/git-co-to-je-a-co-s-tim.html
But it does not seems to work with Github. Another solution i found is create rake task, which will generate redirection pages. But since it's an html, it's not able to send 301 head, so SE crawlers will not recognize it as an redirection.

The best solution is to use both <meta http-equiv="refresh" and <link rel="canonical" href=
It works very well, Google Bot reindexed my entire website under new links without losing positions. Also the users are redirected to the new posts right away.
<meta http-equiv="refresh" content="0; url=http://konradpodgorski.com/blog/2013/10/21/how-i-migrated-my-blog-from-wordpress-to-octopress/">
<link rel="canonical" href="http://konradpodgorski.com/blog/2013/10/21/how-i-migrated-my-blog-from-wordpress-to-octopress/" />
Using <meta http-equiv="refresh" will redirect each visitor to the new post.
As for Google Bot, it treats <link rel="canonical" href= as 301 redirect, the effect is that you get your pages reindexed and that is what you want.
I described whole process how I moved my blog from Wordpress to Octopress here.
http://konradpodgorski.com/blog/2013/10/21/how-i-migrated-my-blog-from-wordpress-to-octopress/#redirect-301-on-github-pages

Have you tried the Jekyll Alias Generator plugin?
You put the alias urls in the YAML front matter of a post:
---
layout: post
title: "My Post With Aliases"
alias: [/first-alias/index.html, /second-alias/index.html]
---
When a user visits one of the alias urls, they are redirected to the main url via a meta tag refresh:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<meta http-equiv="refresh" content="0;url=/blog/my-post-with-aliases/" />
</head>
</html>
See also this blog post on the subject.

redirect-from plugin
https://github.com/jekyll/jekyll-redirect-from#redirect-to
It is supported by GitHub and makes it easy:
_config.yml
gems:
- jekyll-redirect-from
a.md
---
permalink: /a
redirect_to: 'http://example.com'
---
as explained at: https://help.github.com/articles/redirects-on-github-pages/
Now:
firefox localhost:4000/a
will redirect you to example.com.
The plugin takes over whenever the redirect_to is defined by the page.
Tested on GitHub pages v64.
Note: this version has a serious recently fixed bug which wrongly reuses the default layout for the redirect: https://github.com/jekyll/jekyll-redirect-from/pull/106
Manual layout method
If you don't feel like using https://github.com/jekyll/jekyll-redirect-from it's easy to implement it yourself:
a.md
---
layout: 'redirect'
permalink: /a
redir_to: 'http://example.com'
sitemap: false
---
_layouts/redirect.html based on Redirect from an HTML page :
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Redirecting...</title>
{% comment %}
Don't use 'redirect_to' to avoid conflict
with the page redirection plugin: if that is defined
it takes over.
{% endcomment %}
<link rel="canonical" href="{{ page.redir_to }}"/>
<meta http-equiv="refresh" content="0;url={{ page.redir_to }}" />
</head>
<body>
<h1>Redirecting...</h1>
<a href="{{ page.redir_to }}">Click here if you are not redirected.<a>
<script>location='{{ page.redir_to }}'</script>
</body>
</html>
Like this example, the redirect-from plugin does not generate 301s, only meta + JavaScript redirects.
We can verify what is going on with:
curl localhost:4000/a

This solution allows you to use true HTTP redirects via .htaccess — however, nothing involving .htaccess will work on GitHub pages because they do not use Apache.
As of May 2014 GitHub Pages supports redirects, but according to the jekyll-redirect-from Gem documentation they are still based on HTTP-REFRESH (using <meta> tags), which requires full a page load before redirection can occur.
I don't like the <meta> approach so I whipped up a solution for anyone looking to provide real HTTP 301 redirects within an .htaccess file using Apache, which serves a pre-generated Jekyll site:
First, add .htaccess to the include property in _config.yml
include: [.htaccess]
Next, create an .htaccess file and be sure to include YAML front matter. Those dashes are important because now Jekyll will parse the file with Liquid, Jekyll's templating language:
---
---
DirectoryIndex index.html
RewriteEngine On
RewriteBase /
...
Make sure your posts that require redirects have two properties like so:
---
permalink: /my-new-path/
original: blog/my/old/path.php
---
Now in .htaccess, just add a loop:
{% for post in site.categories.post %}
RewriteRule ^{{ post.original }} {{ post.permalink }} [R=301,L]
{% endfor %}
This will dynamically generate .htaccess every time you build the site, and the include in your config file ensures that .htaccess makes it into _site directory.
RewriteRule ^blog/my/old/path.php /my-new-path/ [R=301,L]
From there, it's up to you to serve _site using Apache. I normally clone the full Jekyll repo into a non-webroot directory, then my vhost is a symlink to the _site folder:
ln -s /path/to/my-blog/_site /var/www/vhosts/my-blog.com
Tada! Now Apache can serve the _site folder from your virtual root, complete with .htaccess-powered redirects that use whichever HTTP response code you desire!
You could even get super fancy and use a redirect property within each post's front matter to designate which redirect code to use in your .htaccess loop.

The best option is to avoid url changes altogether by setting the permalink format in _config.yml to match your old blog.
Beyond that, the most complete solution is generating redirect pages, but isn't necessarily worth the effort. I ended up simply making my 404 page a bit friendlier, with javascript to guess the correct new url. It doesn't do anything for search, but actual users can get to the page they were looking for and there's no legacy stuff to support in the rest of the code.
http://tqcblog.com/2012/11/14/custom-404-page-for-a-github-pages-jekyll-blog/

Since github doesn't allow 301 redirects (which isn't surprising), you'll have to make a decision between moving to your new URL structure (and taking a search engine hit) or leaving the URLs the way they are. I suggest you go ahead and make the move. Let the search engine chips fall where they may. If someone hits one of your old links via the search engine, they'll be redirected to the new location. Over time, the search engines will pick up your changes.
Something you can do to help matters is to create a Sitemap where you only list your new pages and not the old ones. This should speed up the replacement of old URLs with the new ones. Additionally, if all your old URLs are in your '/programovani' directory, you can also use a robots.txt file to tell future crawls they should ignore that directory. For example:
User-agent: *
Disallow: /programovani/
It will take a little while for the search engines to catch up with the changes. This isn't really a big deal. As long as the old URLs still exist and redirect actual people to the active pages, you'll be fine.

As others have mentioned, the best solution is to preserve working URLs or duplicate the pages and specify a canonical URL.
Since github pages doesn't support true redirects, I chose to set up rerouter on Heroku to return 301 (permanent) redirects from my site's old domain to the new one. I described the details here:
http://joey.aghion.com/simple-301-redirects/

Jekyll has gone through some major updates in the past few months, so maybe this wasn't possible when this question was originally posted...
Jekyll supports a permalink attribute in the YAML front-matter section of your blog posts. You can specify the URL that you would like your post to have and Jekyll will use that (instead of the filename) when generating your site.
---
title: My special blog post
permalink: /programovani/2010/04/git-co-to-je-a-co-s-tim
---
My blog post markdown content

Related

Can a rel=canonical meta tag point to a 301 redirect URL?

I'm working on a project which has versioned URLs. I want the rel=canonical meta tag to always point to the latest version, and this can always be reached via a 301 redirect.
Here are the URLs:
/example 301 redirect to /example/3
/example/1 <link rel="canonical" href="/example" />
/example/2 <link rel="canonical" href="/example" />
/example/3 <link rel="canonical" href="/example" />
Will this setup work? Which URL will a service like Google choose to index, or will it get caught in a "redirect loop" going between /example and /example/3?
So this website is now being indexed by Google. Here's how Google reacts to this scenario:
Results are shown for both /example and /example/{latestVersion} where {latestVersion} is the result of the 301 redirect (most recent version)
The /example link appears first in the results
Often the links to /example/{latestVersion} are only revealed if the user clicks on the following text:
In order to show you the most relevant results, we have omitted some entries very similar to the 13 already displayed.
If you like, you can repeat the search with the omitted results included.
I am changing the code so that the canonical URL is always /example/{latestVersion}, to ensure duplicate content is not indexed.

using .php with .css or some thing better?

I have a log in page for my web site. The log in file is "index.php" this will be the first page you come to when comming to my site. The rest of my site is HTML with a style.css file providing the look for my site. Now my questions is how do I get my index.php file too look like the rest of my web site?
Right now when you come to mydomain.com/index.php it is just a white page with a log in and password box. I would like my log in page to look like the rest of my web site. Can some one please refer me as how to do this?
I have other .php files that would also need to be linked with the .css such as register.php and so forth. thanks guys.
If there is a different/better method of doing what I need please feel free to chime in, I'm all ears at this point I've been trying to do this for 2 days.
Like you would do in every other html page you will have to link the file the same way.
I guess that you have already seen that in every php file there is html code?
Just stay out of the php brackets
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" type="text/css" href="styles.css">
</head>
<body
<?php
"php code in here"
?>
</body>
</html>
If you don't find the usual html markup somewhere search for a include function in the php file.
Maybe the html header is in other php file and it is being called from there.
They would be included like this
include '_header.php';
You can use the CSS file, similar to how you use it in your HTML files. You can either post the CSS tag below your PHP code, or you can use an echo "cssTagHere"; call within your PHP code.
If you're using a login page, though, are you maintaining that security with the rest of your site by using PHP on your other pages?

How to get rid of INDEXING website FOLDERS

I have put "index.html" files into every folder to create my pages.
For example www.mysite.com/volunteers/jasmine/ will display jasmine's page which is the index.html inside the folder "jasmine". And the "volunteers" folder doesn't contain any "index.html" file but when it's typed in the url as follows mysite.com/volunteers/ it displays all the folders inside volunteers folder under the heading "Index of /volunteers"
404 error document helps only to redirect the mysite.com/volunteers not mysite.com/volunteers/ (which contains a slash in the end)
Please help me get rid of this situation.
Thank you in advance!
in your main folder of www.mysite.com create a file called .htaccess
In that file add this line at the top and save it:
IndexIgnore *
Assuming you are using Apache web server, if configured to check .htaccess (which most are, especially on shared hosts), it will read this rule and prevent indexes of your directories.
Remember the file is called .htaccess (with the dot at the beginning and no file suffix at end)
Here is something to play around with to give you ideas as well, where you test a rule if a file or direct (-f or -d) not found, then perform redirect to file of your choice:
RewriteEngine on
RewriteCond %{DOCUMENT_ROOT}/volunteers/$1/$2 !-f
RewriteCond %{DOCUMENT_ROOT}/volunteers/$1/$2 !-d
RewriteRule ^volunteers/ /pageOfYourChoice.html? [R=301,L]
The server rules are at times trial/error which is why I shared that URL with .htacess tricks for you to determine what is best scenario for what you want to achieve. Here you might want to remove the $2 and just assume everything in volunteers but unsure how you set up your app and how many directories you go. It's trial/error and nice thing with .htaccess is no server reloads/restarts required so try it, test, repeat.
The information from the other answer about Apache and the .htaccess file is correct, but if you're using Microsoft IIS as your web server rather than Apache, you'll need to disable directory browsing. See the information here:
http://technet.microsoft.com/en-us/library/cc731109(v=ws.10)
Another thing to consider is that you could simply create an INDEX.HTML page for that folder which has a META REFRESH tag to push the user somewhere else.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Untitled Document</title>
</head>
<meta http-equiv="refresh" content="0;URL=/index.html" />
<body>
</body>
</html>
You can do a redirect in the .htaccess file as well but for most users creating the HTML file is quicker and easier.

Atlassian Confluence - Redirect to a new page on 404 Error

confluence-3.2.1_0
How to make a redirect to a new page(create page in current space) on 404 Error in Atlassian Confluence?
I think I need to change action in web.xml:
<error-page>
<error-code>404</error-code>
<location>/fourohfour.action</location>
</error-page>
To something like:
<error-page>
<error-code>404</error-code>
<location>/createpage.action</location>
</error-page>
/pages/createpage-entervariables.action?spaceKey=KEY
but you don't have the key so I think you have a problem
From the steps listed here, instead of updating the 404 page you could update your links so that if the page exists, the user is redirected there, otherwise they are able to create the page.
The links are of the style-
http://xxxxx/pages/createpage.action?spaceKey=experiment&title=this+does+not+exist&linkCreation=true&fromPageId=623770
While my answers a bit different, (no create page, I just redirect to main SPACE), here is it. Very Simple and could possible be tailored for what you want.
Note: 404.vm is what is called by fourohfour.action. Just leave web.xml alone and edit 404.vm!
sudo mv /opt/atlassian/confluence/confluence/404.vm /opt/atlassian/confluence/confluence/404.vm.original
sudo nano /opt/atlassian/confluence/confluence/404.vm
<!DOCTYPE HTML>
<meta charset="UTF-8">
<meta http-equiv="refresh" content="1; url=http://example.com/url">
<script>
window.location.href = "http://example.com/url"
</script>
<title>Page Redirection</title>
<!-- Note: don't tell people to `click` the link, just tell them that it is a link. -->
If you are not redirected automatically, follow the <a href='link'>http://example/url'>link to example</a>

301 Redirects using Typepad

Does any know if it is possible to do redirects using Typepad?
Not domain mapping but pure honest to goodness 301 redirects. There seems to be some mention of a .htaccess file put in the root of the site working but it has not worked for me.
In your header, you can add a meta Refresh tag with time set to zero, pointing to your new blog.
Example:
<meta http-equiv="refresh" content="0;url=http://example.com/" />
If Typepad allows, insert this inside your <head> section. And while you're at it, add a rel=canonical tag pointing to your new domain, too.