Canonical链接和301 Redirect如果URL与slug不匹配

Rya*_*yan 8 python django redirect slug http-status-code-301

我正在尝试实现类似于django/python中的堆栈溢出的URL方案.

例如,pk与标题的slug一起存储在URL中,因此对于这个问题(id#4787731),URL是

https://stackoverflow.com/questions/4787731/canonical-links-and-301-redirect-if-url-doesnt-match-slug
Run Code Online (Sandbox Code Playgroud)

如果我以后更改标题(或者只是将一些随机的crud放入网址),那么该网站仍然会知道我追究的是哪个问题(通过ID)并将301重定向到正确的网址 - 例如尝试.

https://stackoverflow.com/questions/4787731/canonical-links-MODIFIED-URL
Run Code Online (Sandbox Code Playgroud)

所以

  • 在我的网页中包含规范链接的最佳方式是什么?

    <link rel ="canonical"href ="/sf/ask/335141201/">

(我可以使用get_absolute_url)

  • 识别当前URL与规范链接不匹配并发出301的最佳方法是什么?

注意 - 这个问题类似,但仅针对动态生成slu or或静态生成slug的情况.

Yuj*_*ita 6

1:如果反正有301,我认为使用规范标签是没有意义的.

让我们试想一下,你来自哪里,更改URL的情景/q/111/hello-world/q/111/foobar.引擎不会假设两者是相等的,除非他们访问原始网址时指向其上的规范标记/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})
Run Code Online (Sandbox Code Playgroud)