Django: определите URL-адреса, которые предоставляют дублированный контент, и установите каноническую ссылку

#django #url #seo #django-views

#django #url #seo #django-просмотры

Вопрос:

models.py

 class People(models.Model):
    name = models.CharField(max_length=16)
    meters_away = models.IntegerField()
  

Давайте заполним базу данных:

 >>> from people.models import People
>>> a = People()
>>> a.name = 'George'
>>> a.meters_away = 15
>>> a.save()
>>> b = People()
>>> b.name = 'Jim'
>>> b.meters_away = 10
>>> b.save()
  

Предположим, что у нас есть URL, который возвращает всех пользователей в диапазоне x метров:

http://example.com/range/<meters>

Эта схема URL-адресов принимает 3 обращения следующим образом:

  1. http://example.com/range/20
  2. http://example.com/range/30
  3. http://example.com/range/40

Эти обращения создадут следующие запросы:

 >>> hit1 = People.objects.filter(meters_away__lt=20)
>>> hit2 = People.objects.filter(meters_away__lt=30)
>>> hit3 = People.objects.filter(meters_away__lt=40)
  

Где:

 >>> list(hit1) == list(hit2) == list(hit3)
>>> True
  

Это означает, что example.com , будет обслуживать 3 разных URL-адреса с одинаковым контентом.

С точки зрения SEO, как все возможные URL-адреса (метры: 21, 22, 23, 24, 30, 40 и т.д.) фильтруются таким образом, чтобы к ним добавлялся канонический URL?

Ответ №1:

Насколько я понял ваш вопрос, вы можете захотеть получить максимальное расстояние в метрах, которое дает тот же результат, что и текущее расстояние (скажем, m метров):

 next_number = People.objects.filter(meters_away__gte=m).order_by('meters_away')[:1]
next_number = next_number[0] if next_number else m
  

и канонический URL-адрес будет:

http://example.com/range/<next_number>

Комментарии:

1. Мой пример тривиален и в нем отсутствуют важные факторы, которые могли бы сделать его более надежным. Тем не менее, ваш ответ раскрывает идею, которая заставит его работать. Спасибо!