Канонические ссылки и 301 Перенаправление, если URL-адрес не соответствует slug

Я пытаюсь реализовать схему URL, похожую на переполнение стека в django / python.

Например, pk хранится в URL-адресе вместе с заголовком заголовка, поэтому для этого вопроса (id # 4787731) URL-адрес

https://stackoverflow.com/questions/4787731/canonical-links-and-301-redirect-if-url-doesnt-match-slug 

Если позже я изменю заголовок (или просто добавлю некоторые случайные crud в url), то сайт все равно узнает, с каким вопросом я буду (по ID) и переадресую 301 на правильный URL – например, попробуйте.

 https://stackoverflow.com/questions/4787731/canonical-links-MODIFIED-URL 

Так

  • Каков наилучший способ включить канонические ссылки на мои страницы, такие как

    <link rel = "canonical" href = "https://stackoverflow.com/questions/4787731/canonical-links-and-301-redirect-if-url-doesnt-match-slug">

(могу ли я использовать get_absolute_url)

  • Каков наилучший способ узнать, что текущий URL-адрес не соответствует канонической ссылке и выдает 301?

Примечание. Этот вопрос аналогичен, но касается только случая генерации пули на лету или статически.

2 Solutions collect form web for “Канонические ссылки и 301 Перенаправление, если URL-адрес не соответствует slug”

1: Я не думаю, что есть смысл использовать канонический тег, если в любом случае есть 301.

Давайте представим себе сценарий, в котором вы измените URL-адрес из /q/111/hello-world в /q/111/foobar . Двигатели не предполагают, что они равны, если они не посещают исходный url с каноническим тегом на нем, указывающим на /q/111/foobar (что обычно не будет, потому что теперь это 301, что лишает каких-либо доказательств взаимосвязи между страницами ).

2: Я бы сделал это прямолинейно. Определите не уникальное поле slug и сравните с захваченным URL-адресом в своем подробном представлении.

 # models class MyModel(models.Model): # ... non_unique_slug = models.SlugField() def get_absolute_url(self): return "/questions/%s/%s" % (self.id, self.non_unique_slug) # urls r'^questions/(?P<id>\d+)/(?P<slug>[\w-]+)/$' # views def my_view(request, id, slug): page = Page.objects.get(id=id) if not slug == page.slug: return http.HttpResponsePermanentRedirect(page.get_absolute_url()) # render page return direct_to_template(request, "foobar.html", {'page': page}) 

Я последовал за полезными инструкциями Yuji, но обнаружил, что вам нужно будет использовать объект HttpResponsePermanentRedirect чтобы получить постоянный 301 вместо временного 302.

Python - лучший язык программирования в мире.