2011-01-24 8 views
8

Próbuję zaimplementować schemat URL podobny do przepełnienia stosu w django/python.Linki kanoniczne i przekierowanie 301, jeśli adres URL nie pasuje do wtyczki

E.g. PK jest przechowywany w adresie URL wraz ze ślimaka tytułu więc na to pytanie (id # 4787731) adres URL jest

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

Gdybym później zmienić tytuł (lub po prostu umieścić w jakimś losowym CRUD do adresu URL) wtedy strona nadal będzie wiedziała, na które pytanie czekam (według ID) i przekieruje 301 na poprawny adres URL - np próbować.

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

Więc

  • Jaki jest najlepszy sposób na to kanoniczne linki w moich stronach, takich jak

    < link rel = "canonical" href = "https://stackoverflow.com/pytania/4787731/kanoniczne-linki-a-301-przekierowanie-if-url-doesnt-match-pocisk ">

(można użyć get_absol ute_url)

  • Jaki jest najlepszy sposób, aby rozpoznać, że bieżący adres URL nie pasuje do linku kanonicznego i wydać 301?

Uwaga - To pytanie jest podobne, ale tylko rozwiązuje sprawę generating the slug on the fly or statically.

+0

co byłoby użycie tagu kanonicznego, jeśli planujesz zrobić 301 tak czy inaczej? – Wolph

+0

Dobre pytanie, dokładnie to, co robi SO, obejmuje wszystkie podstawy, które podejrzewam. – Ryan

+0

Powiązane: [Przekierowanie z Generic View DetailView w Django] (https://stackoverflow.com/questions/6456586/redirect-from-generic-view-detailview-in-django) – User

Odpowiedz

6

1: Nie sądzę, że istnieje punkt w użyciu tagu kanonicznego, jeśli istnieją Przekierowania 301 anyways.

Wyobraźmy sobie scenariusz, w którym zmienisz adres URL z /q/111/hello-world na /q/111/foobar. Silniki nie będą zakładały, że te dwa są równe, chyba że odwiedzają oryginalny adres URL z tagiem kanonicznym na nim, wskazując na /q/111/foobar (co nie będzie, ponieważ jest to 301, zrywając dowód związku między stronami).

2: Zrobiłbym to w prosty sposób. Zdefiniuj unikatowe pole slug i porównaj z przechwyconym adresem URL w widoku szczegółów.

# 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}) 
Powiązane problemy