Latest commit

History

21 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

301RedirectModule

An improved version of the Sitecore 301 redirect module. Original version was created by Chris Castle, available at http://trac.sitecore.net/301RedirectModule

Improvements by Chris Adams, http://www.cadams.com.au/

Changelog

Version 1.1.2:

  • Fixed an exception when using exact URL matching on pattern items.

Version 1.1.1:

  • Support for encodeNames="true" (used for Sitecore friendly URLs; most notably, this will make redirects work when dashes in URLs correspond to spaces in item names)

Version 1.1:

  • Redirects for items which already exist
  • Case-insensitive URL matching
  • Path and query matching

New Features

  • Works with Sitecore friendly URLs!
  • Case-insensitive matching of URLs
  • Ability to process redirects for specific items which already exist. Useful if you have an existing item, but need to change part of a query string. Beware of the performance implications as the list of items is examined against every request.

Redirecting when items already exist

  • Match the path and query of a request, ignoring the hostname portion of the user's request. Useful if you need your match to work in multiple environments but don't want to list them in the redirect item.

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
  • Requested Expression: ^/MovedItem/?
  • Source Item: /sitecore/content/MySiteRoot/Destination
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

  • Requested Expression: ^/SomeItem/Path/?\?(.*)name=OldValue(.*)
  • Source Item: /sitecore/content/MySiteRoot/SomeItem/Path?$1name=NewValue$2
Improving SEO: Remove .aspx extension
  • Requested Expression: ^/MovedItem(.aspx)?$
  • Source Item: /sitecore/content/MySiteRoot/Destination
Preserving the query string
  • Requested Expression: ^/MovedItem(?<OptionalQueryString>\?.*)?$
  • Source Item: /sitecore/Content/MySiteRoot/Destination${OptionalQueryString}
Move an area of your site
  • Requested Expression: ^/MovedSiteArea(?<Path>/.*?)?(.aspx)?(?<OptionalQueryString>\?.*)?$
  • Source Item: /sitecore/content/MySiteRoot/NewLocationOfSiteArea${Path}${OptionalQueryString}

Other goodies

How to redirect other extensions

With thanks to RyanEaves, https://github.com/RyanEaves - originally from cadamsdotcom#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!

About

An improved version of the Sitecore 301 redirect module by Chris Castle, available at http://trac.sitecore.net/301RedirectModule

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

21 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

301RedirectModule

An improved version of the Sitecore 301 redirect module. Original version was created by Chris Castle, available at http://trac.sitecore.net/301RedirectModule

Improvements by Chris Adams, http://www.cadams.com.au/

Changelog

Version 1.1.2:

  • Fixed an exception when using exact URL matching on pattern items.

Version 1.1.1:

  • Support for encodeNames="true" (used for Sitecore friendly URLs; most notably, this will make redirects work when dashes in URLs correspond to spaces in item names)

Version 1.1:

  • Redirects for items which already exist
  • Case-insensitive URL matching
  • Path and query matching

New Features

  • Works with Sitecore friendly URLs!
  • Case-insensitive matching of URLs
  • Ability to process redirects for specific items which already exist. Useful if you have an existing item, but need to change part of a query string. Beware of the performance implications as the list of items is examined against every request.

Redirecting when items already exist

  • Match the path and query of a request, ignoring the hostname portion of the user's request. Useful if you need your match to work in multiple environments but don't want to list them in the redirect item.

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
  • Requested Expression: ^/MovedItem/?
  • Source Item: /sitecore/content/MySiteRoot/Destination
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

  • Requested Expression: ^/SomeItem/Path/?\?(.*)name=OldValue(.*)
  • Source Item: /sitecore/content/MySiteRoot/SomeItem/Path?$1name=NewValue$2
Improving SEO: Remove .aspx extension
  • Requested Expression: ^/MovedItem(.aspx)?$
  • Source Item: /sitecore/content/MySiteRoot/Destination
Preserving the query string
  • Requested Expression: ^/MovedItem(?<OptionalQueryString>\?.*)?$
  • Source Item: /sitecore/Content/MySiteRoot/Destination${OptionalQueryString}
Move an area of your site
  • Requested Expression: ^/MovedSiteArea(?<Path>/.*?)?(.aspx)?(?<OptionalQueryString>\?.*)?$
  • Source Item: /sitecore/content/MySiteRoot/NewLocationOfSiteArea${Path}${OptionalQueryString}

Other goodies

How to redirect other extensions

With thanks to RyanEaves, https://github.com/RyanEaves - originally from cadamsdotcom#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!

About

An improved version of the Sitecore 301 redirect module by Chris Castle, available at http://trac.sitecore.net/301RedirectModule

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

21 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

301RedirectModule

An improved version of the Sitecore 301 redirect module. Original version was created by Chris Castle, available at http://trac.sitecore.net/301RedirectModule

Improvements by Chris Adams, http://www.cadams.com.au/

Changelog

Version 1.1.2:

  • Fixed an exception when using exact URL matching on pattern items.

Version 1.1.1:

  • Support for encodeNames="true" (used for Sitecore friendly URLs; most notably, this will make redirects work when dashes in URLs correspond to spaces in item names)

Version 1.1:

  • Redirects for items which already exist
  • Case-insensitive URL matching
  • Path and query matching

New Features

  • Works with Sitecore friendly URLs!
  • Case-insensitive matching of URLs
  • Ability to process redirects for specific items which already exist. Useful if you have an existing item, but need to change part of a query string. Beware of the performance implications as the list of items is examined against every request.

Redirecting when items already exist

  • Match the path and query of a request, ignoring the hostname portion of the user's request. Useful if you need your match to work in multiple environments but don't want to list them in the redirect item.

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
  • Requested Expression: ^/MovedItem/?
  • Source Item: /sitecore/content/MySiteRoot/Destination
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

  • Requested Expression: ^/SomeItem/Path/?\?(.*)name=OldValue(.*)
  • Source Item: /sitecore/content/MySiteRoot/SomeItem/Path?$1name=NewValue$2
Improving SEO: Remove .aspx extension
  • Requested Expression: ^/MovedItem(.aspx)?$
  • Source Item: /sitecore/content/MySiteRoot/Destination
Preserving the query string
  • Requested Expression: ^/MovedItem(?<OptionalQueryString>\?.*)?$
  • Source Item: /sitecore/Content/MySiteRoot/Destination${OptionalQueryString}
Move an area of your site
  • Requested Expression: ^/MovedSiteArea(?<Path>/.*?)?(.aspx)?(?<OptionalQueryString>\?.*)?$
  • Source Item: /sitecore/content/MySiteRoot/NewLocationOfSiteArea${Path}${OptionalQueryString}

Other goodies

How to redirect other extensions

With thanks to RyanEaves, https://github.com/RyanEaves - originally from cadamsdotcom#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!

About

An improved version of the Sitecore 301 redirect module by Chris Castle, available at http://trac.sitecore.net/301RedirectModule

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

21 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

301RedirectModule

An improved version of the Sitecore 301 redirect module. Original version was created by Chris Castle, available at http://trac.sitecore.net/301RedirectModule

Improvements by Chris Adams, http://www.cadams.com.au/

Changelog

Version 1.1.2:

  • Fixed an exception when using exact URL matching on pattern items.

Version 1.1.1:

  • Support for encodeNames="true" (used for Sitecore friendly URLs; most notably, this will make redirects work when dashes in URLs correspond to spaces in item names)

Version 1.1:

  • Redirects for items which already exist
  • Case-insensitive URL matching
  • Path and query matching

New Features

  • Works with Sitecore friendly URLs!
  • Case-insensitive matching of URLs
  • Ability to process redirects for specific items which already exist. Useful if you have an existing item, but need to change part of a query string. Beware of the performance implications as the list of items is examined against every request.

Redirecting when items already exist

  • Match the path and query of a request, ignoring the hostname portion of the user's request. Useful if you need your match to work in multiple environments but don't want to list them in the redirect item.

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
  • Requested Expression: ^/MovedItem/?
  • Source Item: /sitecore/content/MySiteRoot/Destination
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

  • Requested Expression: ^/SomeItem/Path/?\?(.*)name=OldValue(.*)
  • Source Item: /sitecore/content/MySiteRoot/SomeItem/Path?$1name=NewValue$2
Improving SEO: Remove .aspx extension
  • Requested Expression: ^/MovedItem(.aspx)?$
  • Source Item: /sitecore/content/MySiteRoot/Destination
Preserving the query string
  • Requested Expression: ^/MovedItem(?<OptionalQueryString>\?.*)?$
  • Source Item: /sitecore/Content/MySiteRoot/Destination${OptionalQueryString}
Move an area of your site
  • Requested Expression: ^/MovedSiteArea(?<Path>/.*?)?(.aspx)?(?<OptionalQueryString>\?.*)?$
  • Source Item: /sitecore/content/MySiteRoot/NewLocationOfSiteArea${Path}${OptionalQueryString}

Other goodies

How to redirect other extensions

With thanks to RyanEaves, https://github.com/RyanEaves - originally from cadamsdotcom#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!

About

An improved version of the Sitecore 301 redirect module by Chris Castle, available at http://trac.sitecore.net/301RedirectModule

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

21 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

301RedirectModule

An improved version of the Sitecore 301 redirect module. Original version was created by Chris Castle, available at http://trac.sitecore.net/301RedirectModule

Improvements by Chris Adams, http://www.cadams.com.au/

Changelog

Version 1.1.2:

  • Fixed an exception when using exact URL matching on pattern items.

Version 1.1.1:

  • Support for encodeNames="true" (used for Sitecore friendly URLs; most notably, this will make redirects work when dashes in URLs correspond to spaces in item names)

Version 1.1:

  • Redirects for items which already exist
  • Case-insensitive URL matching
  • Path and query matching

New Features

  • Works with Sitecore friendly URLs!
  • Case-insensitive matching of URLs
  • Ability to process redirects for specific items which already exist. Useful if you have an existing item, but need to change part of a query string. Beware of the performance implications as the list of items is examined against every request.

Redirecting when items already exist

  • Match the path and query of a request, ignoring the hostname portion of the user's request. Useful if you need your match to work in multiple environments but don't want to list them in the redirect item.

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
  • Requested Expression: ^/MovedItem/?
  • Source Item: /sitecore/content/MySiteRoot/Destination
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

  • Requested Expression: ^/SomeItem/Path/?\?(.*)name=OldValue(.*)
  • Source Item: /sitecore/content/MySiteRoot/SomeItem/Path?$1name=NewValue$2
Improving SEO: Remove .aspx extension
  • Requested Expression: ^/MovedItem(.aspx)?$
  • Source Item: /sitecore/content/MySiteRoot/Destination
Preserving the query string
  • Requested Expression: ^/MovedItem(?<OptionalQueryString>\?.*)?$
  • Source Item: /sitecore/Content/MySiteRoot/Destination${OptionalQueryString}
Move an area of your site
  • Requested Expression: ^/MovedSiteArea(?<Path>/.*?)?(.aspx)?(?<OptionalQueryString>\?.*)?$
  • Source Item: /sitecore/content/MySiteRoot/NewLocationOfSiteArea${Path}${OptionalQueryString}

Other goodies

How to redirect other extensions

With thanks to RyanEaves, https://github.com/RyanEaves - originally from cadamsdotcom#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!

About

An improved version of the Sitecore 301 redirect module by Chris Castle, available at http://trac.sitecore.net/301RedirectModule

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

21 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

301RedirectModule

An improved version of the Sitecore 301 redirect module. Original version was created by Chris Castle, available at http://trac.sitecore.net/301RedirectModule

Improvements by Chris Adams, http://www.cadams.com.au/

Changelog

Version 1.1.2:

  • Fixed an exception when using exact URL matching on pattern items.

Version 1.1.1:

  • Support for encodeNames="true" (used for Sitecore friendly URLs; most notably, this will make redirects work when dashes in URLs correspond to spaces in item names)

Version 1.1:

  • Redirects for items which already exist
  • Case-insensitive URL matching
  • Path and query matching

New Features

  • Works with Sitecore friendly URLs!
  • Case-insensitive matching of URLs
  • Ability to process redirects for specific items which already exist. Useful if you have an existing item, but need to change part of a query string. Beware of the performance implications as the list of items is examined against every request.

Redirecting when items already exist

  • Match the path and query of a request, ignoring the hostname portion of the user's request. Useful if you need your match to work in multiple environments but don't want to list them in the redirect item.

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
  • Requested Expression: ^/MovedItem/?
  • Source Item: /sitecore/content/MySiteRoot/Destination
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

  • Requested Expression: ^/SomeItem/Path/?\?(.*)name=OldValue(.*)
  • Source Item: /sitecore/content/MySiteRoot/SomeItem/Path?$1name=NewValue$2
Improving SEO: Remove .aspx extension
  • Requested Expression: ^/MovedItem(.aspx)?$
  • Source Item: /sitecore/content/MySiteRoot/Destination
Preserving the query string
  • Requested Expression: ^/MovedItem(?<OptionalQueryString>\?.*)?$
  • Source Item: /sitecore/Content/MySiteRoot/Destination${OptionalQueryString}
Move an area of your site
  • Requested Expression: ^/MovedSiteArea(?<Path>/.*?)?(.aspx)?(?<OptionalQueryString>\?.*)?$
  • Source Item: /sitecore/content/MySiteRoot/NewLocationOfSiteArea${Path}${OptionalQueryString}

Other goodies

How to redirect other extensions

With thanks to RyanEaves, https://github.com/RyanEaves - originally from cadamsdotcom#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!

About

An improved version of the Sitecore 301 redirect module by Chris Castle, available at http://trac.sitecore.net/301RedirectModule

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

21 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

301RedirectModule

An improved version of the Sitecore 301 redirect module. Original version was created by Chris Castle, available at http://trac.sitecore.net/301RedirectModule

Improvements by Chris Adams, http://www.cadams.com.au/

Changelog

Version 1.1.2:

  • Fixed an exception when using exact URL matching on pattern items.

Version 1.1.1:

  • Support for encodeNames="true" (used for Sitecore friendly URLs; most notably, this will make redirects work when dashes in URLs correspond to spaces in item names)

Version 1.1:

  • Redirects for items which already exist
  • Case-insensitive URL matching
  • Path and query matching

New Features

  • Works with Sitecore friendly URLs!
  • Case-insensitive matching of URLs
  • Ability to process redirects for specific items which already exist. Useful if you have an existing item, but need to change part of a query string. Beware of the performance implications as the list of items is examined against every request.

Redirecting when items already exist

  • Match the path and query of a request, ignoring the hostname portion of the user's request. Useful if you need your match to work in multiple environments but don't want to list them in the redirect item.

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
  • Requested Expression: ^/MovedItem/?
  • Source Item: /sitecore/content/MySiteRoot/Destination
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

  • Requested Expression: ^/SomeItem/Path/?\?(.*)name=OldValue(.*)
  • Source Item: /sitecore/content/MySiteRoot/SomeItem/Path?$1name=NewValue$2
Improving SEO: Remove .aspx extension
  • Requested Expression: ^/MovedItem(.aspx)?$
  • Source Item: /sitecore/content/MySiteRoot/Destination
Preserving the query string
  • Requested Expression: ^/MovedItem(?<OptionalQueryString>\?.*)?$
  • Source Item: /sitecore/Content/MySiteRoot/Destination${OptionalQueryString}
Move an area of your site
  • Requested Expression: ^/MovedSiteArea(?<Path>/.*?)?(.aspx)?(?<OptionalQueryString>\?.*)?$
  • Source Item: /sitecore/content/MySiteRoot/NewLocationOfSiteArea${Path}${OptionalQueryString}

Other goodies

How to redirect other extensions

With thanks to RyanEaves, https://github.com/RyanEaves - originally from cadamsdotcom#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!

About

An improved version of the Sitecore 301 redirect module by Chris Castle, available at http://trac.sitecore.net/301RedirectModule

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

21 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

301RedirectModule

An improved version of the Sitecore 301 redirect module. Original version was created by Chris Castle, available at http://trac.sitecore.net/301RedirectModule

Improvements by Chris Adams, http://www.cadams.com.au/

Changelog

Version 1.1.2:

  • Fixed an exception when using exact URL matching on pattern items.

Version 1.1.1:

  • Support for encodeNames="true" (used for Sitecore friendly URLs; most notably, this will make redirects work when dashes in URLs correspond to spaces in item names)

Version 1.1:

  • Redirects for items which already exist
  • Case-insensitive URL matching
  • Path and query matching

New Features

  • Works with Sitecore friendly URLs!
  • Case-insensitive matching of URLs
  • Ability to process redirects for specific items which already exist. Useful if you have an existing item, but need to change part of a query string. Beware of the performance implications as the list of items is examined against every request.

Redirecting when items already exist

  • Match the path and query of a request, ignoring the hostname portion of the user's request. Useful if you need your match to work in multiple environments but don't want to list them in the redirect item.

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
  • Requested Expression: ^/MovedItem/?
  • Source Item: /sitecore/content/MySiteRoot/Destination
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

  • Requested Expression: ^/SomeItem/Path/?\?(.*)name=OldValue(.*)
  • Source Item: /sitecore/content/MySiteRoot/SomeItem/Path?$1name=NewValue$2
Improving SEO: Remove .aspx extension
  • Requested Expression: ^/MovedItem(.aspx)?$
  • Source Item: /sitecore/content/MySiteRoot/Destination
Preserving the query string
  • Requested Expression: ^/MovedItem(?<OptionalQueryString>\?.*)?$
  • Source Item: /sitecore/Content/MySiteRoot/Destination${OptionalQueryString}
Move an area of your site
  • Requested Expression: ^/MovedSiteArea(?<Path>/.*?)?(.aspx)?(?<OptionalQueryString>\?.*)?$
  • Source Item: /sitecore/content/MySiteRoot/NewLocationOfSiteArea${Path}${OptionalQueryString}

Other goodies

How to redirect other extensions

With thanks to RyanEaves, https://github.com/RyanEaves - originally from cadamsdotcom#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!

About

An improved version of the Sitecore 301 redirect module by Chris Castle, available at http://trac.sitecore.net/301RedirectModule

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages