如何使用Django HttpResponseRedirect提供规范URL?

时间:2014-03-29 08:24:28

标签: django httpresponse

这个问题与我刚才提到的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的搜索结果显示该页面的链接是丑陋的网址,而不是漂亮的重定向网址。

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

服务器端发生的情况是丑陋网址的视图会重定向:

return HttpResponseRedirect(pretty_url)

3 个答案:

答案 0 :(得分:10)

我认为这是您正在寻找的正确构建的模板标记。     {{request.build_absolute_uri}}

答案 1 :(得分:6)

您可以将其作为Django模板返回的HTML的一部分放在<head>部分中。 你的Django中有base.html吗?您可以将{% block %}设置为规范网址的占位符,然后在{% extends base.html %}

的每个单独页面中设置该值

base.html文件

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

答案 2 :(得分:0)

如果(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找到了您的网站,则您的规范网址将包含该参数。