【问题标题】:How do I redirect all requests with URLs beginning with "www" to a naked domain?如何将 URL 以“www”开头的所有请求重定向到裸域?
【发布时间】:2012-03-10 03:28:47
【问题描述】:

我已成功为我的应用添加 Heroku 自定义域。我想知道如何捕获以www 开头的请求并将它们重定向到裸域。例如,我有以下自定义域映射到我的 Heroku 应用程序:

www.myapp.com
myapp.com

http://myapp.comhttp://www.myapp.com 的请求均成功,但www 保持打开状态。

目标

我希望将所有对 http://www.myapp.com 的请求重定向到 http://myapp.com。这也适用于其他路径,例如 http://www.myapp.com/some/foo/bar/path 重定向到 http://myapp.com/some/foo/bar/path。我想要这样的东西:http://www.stef.io 看看www. 是如何从地址栏中消失的。

到目前为止,我在 Google 上找到的说明是关于编辑我的 .htaccess 文件,但我是在 Heroku 上使用 Flask 框架上的 Python 应用程序运行的。

【问题讨论】:

  • 诚然,无 www 域更美观,但 Heroku 不鼓励尽可能使用顶级域。阅读本期解决方案部分了解更多详情status.heroku.com/incident/245

标签: python redirect heroku dns flask


【解决方案1】:

为此推荐的解决方案是 DNS 级别重定向(请参阅 heroku help)。

或者,您可以注册一个before_request 函数:

from urlparse import urlparse, urlunparse

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

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

【讨论】:

    【解决方案2】:

    我不习惯 Flask,但你可以设置一个匹配 /^www./ 的路由,然后将其重定向到不带“www”的 url。

    您可能需要查看http://werkzeug.pocoo.org/docs/routing/#custom-convertershttp://werkzeug.pocoo.org/docs/routing/#host-matching

    【讨论】:

      猜你喜欢
      • 2015-01-07
      • 1970-01-01
      • 2012-09-27
      • 2015-02-25
      • 1970-01-01
      • 1970-01-01
      • 2020-02-17
      • 1970-01-01
      • 2013-10-31
      相关资源
      最近更新 更多