最近因为改动太大,导致之前被收录的一些页面被搜索引擎抓取返回了404,数量还不少,在谷歌的官方文档中倒是说返回404和410的作用是一样的,但是在我查看了一些资料来讲,大部分还是讲究如果页面已删除,最好返回410代码,方便搜索引擎快速删除,这个是最规范的。
想想这个修改也不麻烦,干脆就开始改造页面了。
原来的views代码如下:
try:
es.getDetailFromOrder(req.LANGUAGE_CODE, number):
job_detail,similar_search,company_search = es.getDetailFromOrder(req.LANGUAGE_CODE, number)
context = {
"job_detail": job_detail,
"similar_search":similar_search,
"company_search":company_search
}
except:
raise Http404(f"{number} does not exist!")
这将在没有数据返回时,抛出一个404异常,并自动加载我定义的404模板文件。
改造如下:
if es.getDetailFromOrder(req.LANGUAGE_CODE, number):
job_detail,similar_search,company_search = es.getDetailFromOrder(req.LANGUAGE_CODE, number)
context = {
"job_detail": job_detail,
"similar_search":similar_search,
"company_search":company_search
}
else:
return HttpResponse("This page deleted!", content_type="text/plain",status=410)
这将返回一个状态码为410的一行字符串页面,如果再想加入自定义的返回页面怎么办呢,参考render的源码,改造如下
from django.template import loader
if es.getDetailFromOrder(req.LANGUAGE_CODE, number):
job_detail,similar_search,company_search = es.getDetailFromOrder(req.LANGUAGE_CODE, number)
context = {
"job_detail": job_detail,
"similar_search":similar_search,
"company_search":company_search
}
else:
return HttpResponse(loader.render_to_string(template_name="404.html", request=req),status=410)
如果搜索的没有关键词,后端添加永久重定向逻辑:
if not params.get("keywords"):
# raise Http404(f"keywords does not exist!")
# 20220908
return redirect(reverse('page'),permanent=True)
参阅:https://developers.google.com/search/blog/2011/05/do-404s-hurt-my-site?hl=zh-cn
http://129.226.226.195/post/21152.html
https://docs.djangoproject.com/zh-hans/4.1/ref/request-response/