2011-01-24 1 views
8

Я пытаюсь реализовать схему URL, похожую на переполнение стека в django/python.Канонические ссылки и 301 Перенаправление, если URL-адрес не соответствует slug

E.g. рк хранится в URL вместе с слизняк названия так для этого вопроса (ID # 4787731) Адрес страницы

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 

Так

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

    < ссылка отн = "канонической" HREF = "https://stackoverflow.com/вопросы/4787731/канонические-ссылки-и-301-перенаправлять-если-url-оленья кожа-матч-слизняка ">

(можно использовать get_absol ute_url)

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

Примечание - Этот вопрос похож, но только рассматривается случай generating the slug on the fly or statically.

+0

, что было бы использование канонического тега, если вы планируете делать 301 в любом случае? – Wolph

+0

Хороший вопрос, это именно то, что СОСТОЯТЬ, покрывают все основания, которые я подозреваю. – Ryan

+0

Связанный: [Перенаправить из Generic View DetailView в Django] (https://stackoverflow.com/questions/6456586/redirect-from-generic-view-detailview-in-django) – User

ответ

6

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 "https://stackoverflow.com/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}) 

 Смежные вопросы

  • Нет связанных вопросов^_^