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

问题描述 投票:0回答:4

这个问题与我刚刚问的问题非常相似 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)
django httpresponse
4个回答
11
投票

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


7
投票

您可以将其作为 Django 模板返回的 HTML 的一部分放在

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

base.html

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

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
找到您的网站,您的规范 URL 将包含该参数。


0
投票

我同意@getup8的观点,即所提出的解决方案会引起问题。如果用于访问页面的 URL 是以编程方式获取的,并且该 URL 不是规范 URL,则非规范 URL 将被声明为规范 URL。这不是你想要的。

我所做的是让 Django 获取视图的 URL,如下所示:

<link rel="canonical" href="https://www.example.com{% url 'view_name' %}">

因此忽略用户实际使用的任何路径,并始终使用标准的基本视图 URL 作为规范路径。是的,这意味着在每个页面中命名视图,但仍然比硬编码 URL 更好。

© www.soinside.com 2019 - 2024. All rights reserved.