Sojan Jose
Sojan Jose

Reputation: 3238

How to do SEO Url changes and Redirects for google AppEngine Webapp2 Urls?

I am moving my company website to google app engine, Its mostly static content with small sections like dates to be generated using python. I have setup everything correctly and its working fine on app engine. Now I want to make few SEO related URL changes.

This is the line of code by which the website is served now .

app = webapp2.WSGIApplication([
    ('/', IndexPage),
    ('/discover', DiscoverPage),
    ('/about', AboutPage),
    ('/help', HelpPage),
    ('/terms-and-privacy', TermsPage)
], debug=True)

with classes like this defined for each page.

class DiscoverPage(webapp2.RequestHandler):
    def get(self):
        template_values = {
            'bodyclass': 'discover',
        }
        template = JINJA_ENVIRONMENT.get_template('discover.html')
        self.response.write(template.render(template_values))

Now the things I want to achieve are :

I have added both www and non www mappings at the app engine developer console, the site is currently accessible from both www and non www urls.but I only want non www version

Right now domain.com/discover works fine but domain.com/discover/ ends up in 404 .

I haven't got much experience with python webapps and my background is mainly apache/nginx servers and php . Does AppEngine got anything like htaccess rules or nginx rewrites ?

Upvotes: 1

Views: 233

Answers (2)

Sojan Jose
Sojan Jose

Reputation: 3238

@Mihail answer help to fix the issues correctly. adding some details towards his answer .

for fixing the second issue [trailing slashes] , if you try strict_slash you might end up getting this error or some others.

ValueError: Routes with strict_slash must have a name.

So documenting the steps by which i got it working

import RedirectRoute to the code

from webapp2_extras.routes import RedirectRoute

Change in code accordingly with name parameter

app = webapp2.WSGIApplication([
    DomainRoute('www.'+SITE_DOMAIN, [
            webapp2.Route(r'/<:.*>', handler=RedirectWWW),
    ]),
     RedirectRoute('/', IndexPage,strict_slash=True,name="index"),
     RedirectRoute('/discover', DiscoverPage,strict_slash=True,name="discover"),
     RedirectRoute('/about', AboutPage,strict_slash=True,name="about"),
     RedirectRoute('/help', HelpPage,strict_slash=True,name="help"),
     RedirectRoute('/terms-and-privacy', TermsPage,strict_slash=True,name="terms")
], debug=True)

Upvotes: 0

Mihail Russu
Mihail Russu

Reputation: 2536

You could first catch ALL requests to the "www" subdomain:

from webapp2_extras.routes import DomainRoute

app = webapp2.WSGIApplication([

    DomainRoute('www.domain.com', [
            webapp2.Route(r'/<:.*>', handler=RedirectWWW),
    ]),

    ('/', IndexPage),
    ('/discover', DiscoverPage),
    ('/about', AboutPage),
    ('/help', HelpPage),
    ('/terms-and-privacy', TermsPage)
], debug=True)

with a handler that replaces the www part with the naked domain:

class RedirectWWW(webapp2.RequestHandler):
    def get(self, *args, **kwargs):
        url = self.request.url.replace(self.request.host, 'domain.com')
        return self.redirect(url, permanent=True)

    def post(self, *args, **kwargs):
        return self.get()

Regarding the second issue, you could read about the strict_slash parameter here: https://webapp-improved.appspot.com/api/webapp2_extras/routes.html

Upvotes: 1

Related Questions