我尝试向我的Django网站添加有效的规范标签。因此,我必须添加不带查询参数的规范网址。我找到了不错的解决方案,但遇到无法解决的麻烦。 我的标签如下:
{% if request.GET %}
<link rel="canonical" href="https://{{ request.get_host }}{{ request.path }}">
{% endif %}
这是一个很好的解决方案,但是在真实站点中,URL为 https://example.com/about-us?page=3
的页面中,我得到了这个规范的URL https://www.example.com/about-us
为什么我在站点域之前得到www
的规范网址
这是我在settings.py
中的 ALLOWED_HOST :
ALLOWED_HOSTS = [
'127.0.0.1',
'www.example.com',
'example.com',
'localhost',
]
在没有www
的情况下如何获取有效的规范网址?
答案 0 :(得分:0)
因为您使用的是request.get_host
,所以它将解析为用户在浏览器中键入的内容。您可能已将DNS记录设置为接受带有或不带有www的域。 Django不在乎其服务的域,除非/除非您正在使用其Sites框架(您的示例代码不会涉及Sites框架,所以我猜您不在)。因此,Django仅根据URL路径进行响应,而忽略域。
您是在问是否可以从入站请求中删除“ www”吗?当然,您可以在Web服务器(apache / nginx等)层使用特定于这些Web服务器的重定向来执行此操作。或者,您可以让请求通过Web服务器,并使用自定义中间件在应用程序服务器层(Django)拦截该请求。 Here就是一个例子。
请注意,您无法使用Django内置的Redirects应用程序,因为该应用程序仅在路径上运行,而您希望操纵传入域本身。
因此,您的选择是:调整Web服务器,或将中间件模块添加到Django项目中。
ALLOWED_HOSTS
设置与您的问题无关。
此外:您的问题有点令人困惑,因为您首先询问有关已删除的查询参数?page=3
,但随后切换到询问域中的www。如果您询问查询参数,请编辑您的问题,因为这样可以保证有不同的答案。