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)
注意 - 这个问题类似,但仅针对动态生成slu or或静态生成slug的情况.
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)
| 归档时间: |
|
| 查看次数: |
4472 次 |
| 最近记录: |