Legacy URLs

A legacy URL is an alternative URL for any given CMS page or other entity for which a URL exists.

For example let’s assume that we have a CMS page with the title Hello and the URL /hello/ on our website example.com. Then the Hello page will come up whenever we visit https://www.example.com/hello/.

Lets assume that we are rebuilding an existing site and that a similar (or the exact page) existed before. Unfortunately the page used to be called Welcome with the URL /pages/welcome.html.

In order to hook this up correctly, we can create a legacy URL for our new page Hello with a legacy URL of /pages/welcome.html. Then any request that is being made to https://www.example.com/pages/welcome.html is automatically issuing a permanent redirect (301) to https://www.example.com/hello/.


All legacy URLs must start with / and must not include a domain name.

For default entities such as CMS pages or shop product pages, legacy URLs are declared via the backend system and will work automatically.

The legacy URL system as part of the CMS system is designed to construct a query based on the property with the name legacy_url. If you add your own entities to the system with the support for legacy URLs, then you need to add the following property to your model:

legacy_url = models.CharField(
    verbose_name='Legacy Url',
    help_text='Legacy document path or full URL. Provide the legacy ' + \
              'URL to this page; how it was used to be named on ' + \
              'the old site.'

Cubane provides a mix-in class for you that you can simply use instead, for example:

from cubane.models import DateTimeBase
from cubane.models.mixin import LegacyUrlMixin

class MyEntity(DateTimeBase, LegacyUrlMixin):

In addition, the CMS system needs to know for which models legacy URLs are supported. You can simply override the method cubane.cms.views.CMS.get_legacy_url_models() on the cubane.cms.views.CMS class in the following way:

from cubane.cms.views import CMS
from myapp.models import MyCustomPageModel

class MyCMS(CMS):
    def get_legacy_url_models(self):
        return super(MyCMS, self).get_legacy_url_models() + [

By adding your model class MyCustomPageModel to the list of supported model classes for legacy URLs, the system will automatically start querying your model as well in case a legacy URL needs to be resolved.

If a legacy URL redirect is triggered, the CMS system will call the method cubane.cms.views.CMS.on_legacy_url() prior to the redirect. In this case, the redirect target or the response can be changed by returning a response object. If no response object is returned then a permanent redirect response is generated automatically reflecting a redirection to the legacy target as determined by the CMS system.

from cubane.cms.views import CMS

class MyCMS(CMS):
    def on_legacy_url(self, request, context):
        return HttpResponse('Intercepted legacy URL redirect for \'%s\' redirecting to \'%s\'.' % (