thecadams / 301RedirectModule

An improved version of the Sitecore 301 redirect module by Chris Castle, available at http://trac.sitecore.net/301RedirectModule
MIT License
30 stars 67 forks source link

301RedirectModule

An improved version of the Sitecore 301 redirect module. Original version was created by Chris Castle. Now upgraded and compatible with Sitecore 9.1 (version 1.7)

Improvements by Chris Adams, Max Slabyak, Mark Wiseman, Thomas Baek, and timgriff84

Changelog

Version 1.9:

Version 1.8:

Version 1.7:

Version 1.6.1:

Version 1.6:

Version 1.5:

Version 1.4:

Version 1.3:

Version 1.2:

Version 1.1.2:

Version 1.1.1:

Version 1.1:

New Features

Redirecting when items already exist

Redirecting and modifying the query string

The regular expression above in the "Requested Expression" field will match any request where the path portion of the URL begins with /old-site-area. For instance, a request to http://mysite.com/old-site-area/homepage will be processed by this redirect. As a side-effect, the path portion under /old-site-area ("/homepage") will be saved for later in a capture group called Path. This is the "^/old-site-area(?/.*?)?" portion of the regular expression.

Because Sitecore accepts URLs ending with .aspx, this regular expression will also process a request to http://mysite.com/old-site-area/homepage.aspx. This is not compulsory but recommended, otherwise you have 2 URLs pointing to one page. This can cause search engines to penalise your content for being duplicated twice on your site. Removing the .aspx extension will help make your content look like it only lives in one place. This is the "(.aspx)?" portion of the regular expression.

Lastly this regular expression accepts (but does not require) a query string, so this regular expression will also match a request to http://mysite.com/old-site-area/homepage.aspx?thesky=blue. This is the "(?\?.*)?$" portion of the regular expression.

This looks complicated but it's not magic; it's just regular expressions. This is using .NET framework regular expression syntax. You can learn about regular expressions on Wikipedia and test a regular expression with Derek Slager's .NET Regular Expression tester.

OK, example time. A user just sent a request to http://mysite.com/old-site-area/homepage.aspx?thesky=blue. What happens?

  1. The "Requested Expression" is tested and found to be a match, as per above.
  2. The value of the "Source Item" field is substituted as needed. In this case, ${Path} will become "/homepage" and ${OptionalQueryString} will become "?thesky=blue", so the final value of "Source Item" for this request becomes "/sitecore/content/Site/New Site Area/homepage?thesky=blue". ${Path} and ${OptionalQueryString} are names you can see in the "Requested Expression" field.
  3. Everything before the question mark is used to look up the path of an item in the Sitecore tree.
  4. If an item is found, its friendly URL is retrieved. In this case, the URL will be http://mysite.com/new-site-area/homepage
  5. The query string is put on the end. In this case, the URL will become http://mysite.com/new-site-area/homepage?thesky=blue
  6. A 301 redirect is issued, which tells browsers and search engines that the URL the user requested (http://mysite.com/old-site-area/homepage.aspx?thesky=blue) can now be found at http://mysite.com/new-site-area/homepage?thesky=blue.
  7. The user's browser follows the redirect and requests http://mysite.com/new-site-area/homepage?thesky=blue.

Examples

Match only the path, dropping the query string
Replace some of the query string but don't redirect away

Under the Content tab of /sitecore/System/Modules/Redirect Module, Edit the field Items Which Always Process Redirects and add an item, eg. /sitecore/content/MySiteRoot/SomeItem/Path

Improving SEO: Remove .aspx extension
Preserving the query string
Move an area of your site

Other goodies

How to redirect other extensions

With thanks to RyanEaves, https://github.com/RyanEaves - originally from https://github.com/thecadams/301RedirectModule/issues/3

I needed to use this to migrate from a PHP based site, and it took some work to figure out how. So I thought I would share the knowledge. These instructions are for IIS6, although I'm sure you can derive how to do it in IIS7 easily.

  1. Add the extension mapping in IIS for your site.

    Go to properties for your site, Home Directory, Configuration button, Mappings tab, Add...

    • Executable: C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll

      Note: The above path will be different for you if you use x64 or a different version of .net. Just use the same path that is mapped to the .aspx extension and it will work.

    • Extension: .php

    • All Verbs

    • Script engine: checked

    • Verify that file exists: UNCHECKED (very important)

    Click OK

  2. Tell Sitecore to process php files:

    • Open Web.config
    • Do a search for: Sitecore.Pipelines.PreProcessRequest.FilterUrlExtensions
    • Underneath that line, there is a parameter for "Allowed extensions". Add php to the list.

DONE! Now you can add rules to this module that redirect .php files.

You can do this exact same process for other extension types like .html, .jpg/.gif/.png, .pdf, etc as well if you need to redirect those.

Hope that saves someone a few hours of research!