How to provide canonical URL with Django HttpRespo

2020-07-09 07:36发布

This question is very similar to one I just asked href: Can I get Google search results to use/display the final redirect url?, but now the question is specific to Django.

My site has webpage urls that use the following format:

www.mysite.com/id/pretty_title

The front page links to these pages, but the href actually contains some parameters:

 www.mysite.com/id/?some_ugly_parameters_to_let_me_know_what_search_it_is_from

This then redirects to

www.mysite.com/id/pretty_title

which shows the page.

My issue is that Google's search results show the link to the page as the ugly url instead of the pretty redirected one.

What I have learned is that I need to provide a canonical link. But how can I do this when the ugly url page never really exists, at least not as one that I have written?

What happens server side is that the view of the ugly url does a redirect:

return HttpResponseRedirect(pretty_url)

3条回答
Animai°情兽
2楼-- · 2020-07-09 07:55

You can just put it as part of the HTML returned from the Django template, in the <head> section. Do you have a base.html in your Django? You can setup a {% block %} as a placeholder for the canonical URL and then set that value in each individual page that {% extends base.html %}

base.html

<html>
<head>
  <link rel="canonical" href="{% block canonical_url %}{% endblock %}">
</head>
...
查看更多
▲ chillily
3楼-- · 2020-07-09 07:56

I think this is the correct built template tag that you're looking for. {{ request.build_absolute_uri }}

查看更多
手持菜刀,她持情操
4楼-- · 2020-07-09 08:01

A lot of these proposed solutions have issues if (1) you want your www subdomain to be the canonical one and (2) there are URL params in the request path.

I would actually propose to hard code it in the base template and append request.path.

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

If you do end up wanting to use build_absolute_uri, I would do it as follows in your view (or you could create a template function):

canonical_url = request.build_absolute_uri(request.path)

Calling build_absolute_uri() without an argument will call request.get_full_path() and append that to your domain. If a user finds your site via https://www.example.com/?param=123, your canonical URL will include that param.

查看更多
登录 后发表回答