2011-01-24 11 views
8

Estoy tratando de implementar un esquema de URL similar al desbordamiento de pila en django/python.Enlaces canónicos y 301 Redirección si la URL no coincide con la barra

E.g. el pk se almacena en la URL, junto con una babosa del título por lo que para esta pregunta (ID # 4787731) de la URL es

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

Si posteriormente cambia el título (o sólo hay que poner en alguna porquería azar en la url) entonces el sitio aún sabrá qué pregunta estoy buscando (por el ID) y 301 redirigirá a la URL correcta - por ejemplo tratar.

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

Así

  • ¿Cuál es la mejor manera de incluir enlaces canónicos en mis páginas como

    < link rel = href "canónica" = "https://stackoverflow.com/preguntas/4787731/canónicas-links-y-301-redirigir-si-url-doesnt-match-babosa ">

(puedo usar get_absol ute_url)

  • ¿Cuál es la mejor manera de reconocer que la URL actual no coincide con el enlace canónico y emitir un 301?

Nota - Esta pregunta es similar, pero sólo se refiere al caso de generating the slug on the fly or statically.

+0

lo que sería el uso de una etiqueta canónica si planea hacer un 301 de todos modos? – Wolph

+0

Buena pregunta, eso es exactamente lo que SO, cubre todas las bases que sospecho. – Ryan

+0

Relacionado: [Redirigir desde la vista genérica DetailView en Django] (https://stackoverflow.com/questions/6456586/redirect-from-generic-view-detailview-in-django) – User

Respuesta

6

1: No creo que hay un punto en el uso de la etiqueta canónica si hay 301s de todos modos.

Imaginemos un escenario en el que cambie la URL de /q/111/hello-world a /q/111/foobar. Los motores no supondrán que los dos son iguales a menos que visiten la url original con la etiqueta canónica apuntando a /q/111/foobar (que no será así, porque ahora es un 301, cortando cualquier prueba de una relación entre las páginas).

2: Lo haría de la manera directa. Defina un campo slug no exclusivo y compare la URL capturada en su vista detallada.

# 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}) 
Cuestiones relacionadas