Канонические ссылки и 301 Перенаправление, если URL не соответствует слагу - PullRequest
8 голосов
/ 25 января 2011

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

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

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

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

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

Итак

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

Ответы [ 2 ]

6 голосов
/ 25 января 2011

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})
1 голос
/ 19 января 2012

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

...