【问题标题】:How to provide canonical URL with Django HttpResponseRedirect?如何使用 Django HttpResponseRedirect 提供规范 URL?
【发布时间】:2014-05-08 20:31:39
【问题描述】:

这个问题和我刚才问的href: Can I get Google search results to use/display the final redirect url? 非常相似,但现在这个问题是针对 Django 的。

我的网站有使用以下格式的网页网址:

www.mysite.com/id/pretty_title

首页链接到这些页面,但href其实包含一些参数:

 www.mysite.com/id/?some_ugly_parameters_to_let_me_know_what_search_it_is_from

然后重定向到

www.mysite.com/id/pretty_title

显示页面。

我的问题是 Google 的搜索结果将指向页面的链接显示为丑陋的 url,而不是漂亮的重定向。

我学到的是我需要提供一个规范的链接。但是当丑陋的 url 页面从未真正存在时,我怎么能做到这一点,至少不像我写的那样?

服务器端发生的事情是丑陋的url的视图做了重定向:

return HttpResponseRedirect(pretty_url)

【问题讨论】:

    标签: django httpresponse


    【解决方案1】:

    您可以将它作为从 Django 模板返回的 HTML 的一部分放在 <head> 部分中。 你的 Django 中有base.html 吗?您可以设置 {% block %} 作为规范 URL 的占位符,然后在 {% extends base.html %} 的每个单独页面中设置该值

    base.html

    <html>
    <head>
      <link rel="canonical" href="{% block canonical_url %}{% endblock %}">
    </head>
    ...
    

    【讨论】:

    • 这个html页面由pretty_url显示。还是因为它重定向到这个,所以它也“算作”被丑陋的url显示?
    • 在您的 Django 中,应该只有一个视图返回该独特内容,您所要做的就是将规范标签放入该视图的 HTML 中。来自该视图的内容是否可以通过一个或另一个 URL 访问并不重要。
    【解决方案2】:

    我认为这是您正在寻找的正确的内置模板标签。 {{ request.build_absolute_uri }}

    【讨论】:

    • 出于某种原因,build_absolute_uri 给了我 http 方案,即使整个网站都在 https 上。我在 Django 1.6 上(相当老,但这是我们目前所拥有的)。
    • @PritishC
    【解决方案3】:

    如果 (1) 您希望您的 www 子域成为规范的子域,并且 (2) 请求路径中有 URL 参数,那么很多这些建议的解决方案都会出现问题。

    我实际上建议在基本模板中对其进行硬编码并附加request.path

    <link rel="canonical" href="https://www.example.com{{ request.path }}">
    

    如果你最终想要使用build_absolute_uri,我会在你的观点中这样做(或者你可以创建一个模板函数):

    canonical_url = request.build_absolute_uri(request.path)
    

    不带参数调用build_absolute_uri() 将调用request.get_full_path() 并将其附加到您的域。如果用户通过https://www.example.com/?param=123 找到您的网站,您的规范网址将包含该参数。

    【讨论】:

      猜你喜欢
      • 2021-10-08
      • 1970-01-01
      • 2011-08-14
      • 2011-11-26
      • 2010-11-15
      • 1970-01-01
      • 2022-11-19
      • 2019-05-10
      • 2010-10-28
      相关资源
      最近更新 更多