如何在域中不包含“ www”的情况下获取Django绝对URL?

时间:2018-09-03 15:11:53

标签: python django canonical-link

我尝试向我的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的情况下如何获取有效的规范网址?

1 个答案:

答案 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。如果您询问查询参数,请编辑您的问题,因为这样可以保证有不同的答案。