【问题标题】:How do I redirect to the www. version of my Flask site on Heroku?如何重定向到 www. Heroku 上我的 Flask 网站的版本?
【发布时间】:2012-04-03 16:48:11
【问题描述】:

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

我该怎么做?

【问题讨论】:

  • 澄清一下,您有example1.comexample2.comwww.example2.com。您希望对example1.comexample2.com 的所有请求都重定向到www.example2.com。对吗?
  • 只是 example.com 和 www.example.com,example.com/ 重定向到 www.example.com/
  • 你不能只用 DNS 做这个吗?为什么要在应用层这样做?

标签: python heroku flask


【解决方案1】:

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

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

【讨论】:

  • 看起来很有希望。不知道我会如何从那里发出回应,但正在调查它。
  • 最初我以为你需要弄乱werkzeug,但它不像烧瓶钩住它那么简单。如果信号不起作用,您可以随时尝试werkzeug middleware
【解决方案2】:

根据 Heroku Docs,您对使用 www 子域(例如 www.foo.com)与顶点域(例如 foo.com)有正确的想法。他们处理这个问题的建议是使用 DNS 层重定向:

引用:

子域重定向

子域重定向导致301 permanent redirect 到 为顶点域的所有请求指定子域,因此所有当前 并且未来的请求被正确路由并且完整的 www 主机名是 显示在用户的位置字段中。

几乎所有 DNS 提供商都提供域重定向服务 - 有时 也称为域转发。 DNSimple 提供方便的 URL 在这里看到的重定向 从 heroku-sslendpoint.com 顶点重定向 域到 www.heroku-sslendpoint.com 子域。

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

希望有帮助!

【讨论】:

  • 基于 DNS 的解决方案的问题在于它们不保留路径。所以这对我不起作用。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

    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。

    【讨论】:

    • 我做了一些类似的事情,但是你可以使用urlparts = urlparts._replace(netloc='www.example.com')urlunparse(urlparts)而不是替换索引
    • 对于python3:用from urllib.parse import urlparse, urlunparse替换from urlparse import urlparse, urlunparse
    • 最好的办法是使用您的 dns 提供商本地组织重定向,例如使用 A ALIAS
    • @aflaisler DNS 不会更改客户端在 HTTP 请求中发送的主机名。这就是它的用途。
    猜你喜欢
    • 2020-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-15
    • 2019-10-05
    • 1970-01-01
    • 1970-01-01
    • 2015-05-01
    相关资源
    最近更新 更多