如何为 google AppEngine Webapp2 Url 进行 SEO Url 更改和重定向?

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

我正在将我公司的网站移动到 google 应用引擎,它主要是静态内容,其中包含使用 python 生成的日期等小部分。我已经正确设置了所有内容,并且它在 App Engine 上运行良好。现在我想做一些与 SEO 相关的 URL 更改。

这是现在为网站提供服务的代码行。

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

为每个页面定义 类。

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))

现在我想要实现的目标是:

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 .

我对 python webapps 没有太多经验,我的背景主要是 apache/nginx 服务器和 phpAppEngine 是否有类似 htaccess rulesnginx rewrites 的东西?

您可以首先捕获对 "www" 子域的所有请求:

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)

使用将 www 部分替换为裸域的处理程序:

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()

关于第二个问题,您可以在此处阅读有关 strict_slash 参数的信息:https://webapp-improved.appspot.com/api/webapp2_extras/routes.html

@Mihail 回答有助于正确解决问题。在他的回答中添加一些细节。

为了解决第二个问题 [尾部斜杠] ,如果你尝试 strict_slash 你可能会得到这个 error 或其他一些。

ValueError: Routes with strict_slash must have a name.

所以记录我的工作步骤

导入RedirectRoute到代码

from webapp2_extras.routes import RedirectRoute

使用名称参数相应更改代码

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)