这个问题与我刚刚问的问题非常相似 href:我可以获取 Google 搜索结果来使用/显示最终重定向网址吗?,但现在问题是特定于 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 的视图进行了重定向:
return HttpResponseRedirect(pretty_url)
我认为这是您正在寻找的正确的内置模板标签。 {{ request.build_absolute_uri }}
您可以将其作为 Django 模板返回的 HTML 的一部分放在
<head>
部分中。
你的 Django 中有 base.html
吗?您可以将 {% block %}
设置为规范 URL 的占位符,然后在每个单独的页面中设置该值 {% extends base.html %}
base.html
<html>
<head>
<link rel="canonical" href="{% block canonical_url %}{% endblock %}">
</head>
...
如果 (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
找到您的网站,您的规范 URL 将包含该参数。
我同意@getup8的观点,即所提出的解决方案会引起问题。如果用于访问页面的 URL 是以编程方式获取的,并且该 URL 不是规范 URL,则非规范 URL 将被声明为规范 URL。这不是你想要的。
我所做的是让 Django 获取视图的 URL,如下所示:
<link rel="canonical" href="https://www.example.com{% url 'view_name' %}">
因此忽略用户实际使用的任何路径,并始终使用标准的基本视图 URL 作为规范路径。是的,这意味着在每个页面中命名视图,但仍然比硬编码 URL 更好。