如果 URL 与 slug 不匹配,则规范链接和 301 重定向

2024-01-07

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

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

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

如果我稍后更改标题(或者只是在 url 中添加一些随机的内容),那么该网站仍然会知道我在查找哪个问题(通过 ID),并且会 301 重定向到正确的 URL - 例如尝试。

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

So

  • 在我的页面中包含规范链接的最佳方式是什么,例如

(我可以使用 get_absolute_url 吗)

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

注意 - 这个问题是类似的,但只解决以下情况动态或静态地生成段塞。 https://stackoverflow.com/questions/807195/should-i-create-a-slug-on-the-fly-or-store-in-db


1:我认为如果存在 301,那么使用规范标签就没有意义。

让我们想象一下您更改 URL 的场景/q/111/hello-world to /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 "/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})
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如果 URL 与 slug 不匹配,则规范链接和 301 重定向 的相关文章

随机推荐