collective.scriptedredirect
Python
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
bin
docs
src/collective
.gitignore
.travis.yml
CHANGES.txt
MANIFEST.in
README.rst
base.cfg
bootstrap.py
buildout.cfg
i18n.cfg
setup.cfg
setup.py
travis-4.1.x.cfg
travis-4.2.x.cfg
travis-4.3.x.cfg
travis.cfg

README.rst

Introduction

collective.scriptedredirect allows you to write HTTP 302 Moved Temporary and HTTP 301 Moved Permanently redirects for your Plone CMS site in Python code.

https://travis-ci.org/collective/collective.scriptedredirect.png

Benefits

  • The redirect logic is front-end web server independent: no need to touch variouos configuration files of Apache, Varnish or Nginx)
  • Python allows to write more complex logic for redirects easier - no regular expressions!
  • Python scripts in Plone have access to more complete state information: user logged in status, permissions, etc.

Usage

Plone 4+ versions supported.

Installation

Add add-on in buildout.cfg:

eggs =
    ...
    collective.scriptedredirect

Run buildout.

Install Scripted redirects in Python in Site Setup > Add-ons.

Doing redirects through the web

Edit redirect_handler in Zope Management Interface in your site root.

http://cloud.github.com/downloads/collective/collective.scriptedredirect/Screen%20Shot%202012-09-25%20at%201.28.18%20AM.png

In the case of accident use ?no_redirect HTTP query parameter to override the redirecter and fix your site.

Doing redirects through the web

You can also register a browser view called redirect_handler. In this case, you write the redirect code in addon Python code and not through the web.

redirect_handler view is always preferred over redirect_handler script.

Example Python code in redirector.py:

class TestingRedirectHandler(object):
    """ Redirect handler registered as a ``redirect_handler`` Zope 3 <browser:page>
    """

    def __init__(self, context, request):
        self.context = context
        self.request = request

    def __call__(self, url, host, port, path):
        """ Handle redirects per site.

        :param path: Path as written in HTTP request (not site virtual path)

        :return: None if no redirect needed, otherwise a string full HTTP URL to the redirect target

        :raise: zExceptions.Redirect or other custom redirect exception if needed
        """

        # Simple example: always access site over www. domain prefix
        if not url.startswith("http://www."):
            return url.replace("http://", "http://www.")

        # Don't redirect if we are already using www. prefix
        return None

Example ZCML:

<browser:page
    name="redirect_handler"
    for="Products.CMFCore.interfaces.ISiteRoot"
    layer="YOUR_ADDON_LAYER"
    class=".redirector.TestRedirectHandler"
    permission="zope.Public"
    />

Internals

collective.scriptedredirect hooks itself to Zope's pre-traversal hook and is triggered before the request traverses into your Plone site in Zope application server.

Author

Mikko Ohtamaa (blog, Facebook, Twitter, Google+)