繁体   English   中英

如何重定向到 www. Heroku 上我的 Flask 网站的版本?

[英]How do I redirect to the www. version of my Flask site on Heroku?

我有一个 Python Flask 应用程序在 Heroku(Cedar 堆栈)上运行,它有两个自定义域(一个有一个没有 www 子域)。 我想将所有传入请求重定向到 www. 请求的资源的版本( 这个问题<\/a>的反面)。 我想我需要一些 WSGI 中间件,但我找不到一个很好的例子。

我该怎么做呢?

比创建单独的Heroku应用程序更简单的解决方案是before_request函数。

from urlparse import urlparse, urlunparse

@app.before_request
def redirect_nonwww():
    """Redirect non-www requests to www."""
    urlparts = urlparse(request.url)
    if urlparts.netloc == 'example.com':
        urlparts_list = list(urlparts)
        urlparts_list[1] = 'www.example.com'
        return redirect(urlunparse(urlparts_list), code=301)

这将使用“HTTP 301 Moved Permanently”响应将所有非www请求重定向到www。

根据Heroku Docs,你对使用www子域(例如www.foo.com)和apex域(例如foo.com)有了正确的想法。 他们处理此问题的建议是使用DNS层重定向:

报价:

子域重定向

对于到顶点域的所有请求,子域重定向会导致301永久重定向到指定的子域,以便正确路由所有当前和将来的请求,并在用户的位置字段中显示完整的www主机名。

几乎所有DNS提供商都提供域重定向服务 - 有时也称为域转发。 DNSimple提供了一个方便的URL重定向,此处从heroku-sslendpoint.com apex域重定向到www.heroku-sslendpoint.com子域。

资料来源: http//devcenter.heroku.com/articles/avoiding-apex-domains-dns-arecords#subdomain_redirection

希望有所帮助!

一种可能的方法是添加一个函数来侦听request_started ,并进行适当的重定向。

此信号在任何请求处理开始之前发送,但是在设置请求上下文时发送。 由于请求上下文已经绑定,因此订阅者可以使用标准全局代理(例如请求)访问请求。

我最终做的是创建第二个Heroku应用程序,将非www主机名分配给该主机并使用catch所有Flask路由重定向到www版本,保持路径不变。

Try this. 

@app.route('/', methods=['GET', 'POST'], subdomain="www")
@app.route('/<string:path>', methods=['GET', 'POST'], subdomain="www")
def www(path=''):
    return redirect(url_for('app.index')+path)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM