2011-01-24 8 views
8

django/python에서 스택 오버플로와 유사한 URL 체계를 구현하려고합니다.URL이 슬러그와 일치하지 않으면 정식 링크와 301 리디렉션

예. 약동학은이 질문에 대한 그래서 제목 슬러그와 함께 URL에 저장됩니다 (ID 번호 4787731) URL이 나중에 제목을 변경하는 경우

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

(또는 그냥 URL에 어떤 임의의 CRUD에 넣어) 그러면 사이트는 여전히 (ID로) 어떤 질문을하고 올바른 URL로 리디렉션 할지를 알 수 있습니다 (예 : 시험.

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

그래서

  • 내 페이지에서 정식 링크를 포함하는 가장 좋은 방법은 무엇입니까

    같은

    < 같은 링크에 rel = "표준"HREF = "https://stackoverflow.com/질문/4787731/정규 - 링크 및-301 리디렉션-경우 URL에서 나던 경기-슬러그 ">

(나는 get_absol을 사용할 수 있습니다 ute_url)

  • 현재 URL이 표준 링크와 일치하지 않는 것을 인식하고 301을 발행하는 가장 좋은 방법은 무엇입니까?

주 -이 질문은 비슷하지만 단지 generating the slug on the fly or statically.

+0

대신 영구적 인 (301)를 얻기 위해 HttpResponsePermanentRedirect 객체를 사용해야합니다 발견 어쨌든 301을 할 계획이라면 정식 태그 사용? – Wolph

+0

좋은 질문입니다. 그것이 바로 내가하는 모든 근거를 다루는 것입니다. – Ryan

+0

관련 항목 : [장고의 일반 뷰 DetailView에서 리디렉션] (https://stackoverflow.com/questions/6456586/redirect-from-generic-view-detailview-in-django) – User

답변

6

1의 경우를 해결 : 나는 301 리디렉션 어쨌든이있는 경우 표준 태그를 사용하여 한 지점이 있다고 생각하지 않습니다.

URL을 /q/111/hello-world에서 /q/111/foobar으로 변경하는 시나리오를 생각해 봅시다. 엔진은 /q/111/foobar을 가리키는 정식 태그가있는 원래 URL을 방문하지 않는 한 두 개가 동일하다고 가정하지 않습니다 (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})