from django import http import sre class ZapDotHtmlMiddleware(object): """Removes trailing .htm and .html extensions from incoming URLs (GETs only) so that a legacy site ported to Django can continue to support existing bookmarks. Locate in settings.MIDDLEWARE_CLASSES near CommonMiddleware (similar middleware stack location requirements).""" # Dave Rowell, Appropriate Solutions, Inc., www.appropriatesolutions.com def __init__(self): # RE match for .htm or .html at the end of the url, possibly # followed by /, but not including it. Compile once, use many. self.re_trim_html = sre.compile(r'\.html?(?=/?$)', sre.IGNORECASE) def process_request(self, request): """ Rewrite incoming URL if it contains an htm or html extension.""" if request.method == 'GET': #Excise any .html ending. new_path = self.re_trim_html.sub('', request.path) if new_path != request.path: # URL was trimmed; redirect. # (Borrowed from django.middleware.common.CommonMiddleware.) host = http.get_host(request) if host: newurl = "%s://%s%s" % (request.is_secure() and 'https' or 'http', host, new_path) else: newurl = newpath urlencode = request.GET.urlencode() if len(urlencode): newurl += '?' + urlencode return http.HttpResponsePermanentRedirect(newurl) return None