这个问题与我刚才提到的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)
答案 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
找到了您的网站,则您的规范网址将包含该参数。