如何在域中没有“www”的情况下获取 Django Absolute url?

我尝试向我的 Django 站点添加有效的规范标签。所以我必须添加没有查询参数的规范网址。我找到了很好的解决方案,但我遇到了无法解决的问题。我的标签是这样的:


{% if request.GET %}

  <link rel="canonical" href="https://{{ request.get_host }}{{ request.path }}">

{% endif %}

这是一个很好的解决方案,但是在带有 url 的页面中的真实站点中,https://example.com/about-us?page=3我得到了这个规范的 urlhttps://www.example.com/about-us


为什么我www在站点域之前获得规范 url


这是我的ALLOWED_HOST在settings.py:


ALLOWED_HOSTS = [

    '127.0.0.1',

    'www.example.com',

    'example.com',

    'localhost',

]

如何在没有 的情况下获得有效的规范网址www?


眼眸繁星
浏览 106回答 1
1回答

慕码人2483693

因为您正在使用request.get_host,这将解析为用户在浏览器中输入的任何内容。您可能已将 DNS 记录设置为接受带或不带 www 的域。Django 并不关心它所服务的域,除非/除非您使用它的 Sites 框架(您的示例代码不涉及 Sites 框架,所以我猜你不是)。因此,Django 仅根据 URL 路径进行响应,而忽略域。您是在问是否可以从入站请求中删除“www”?当然,您可以在 Web 服务器(apache/nginx 等)层使用特定于这些 Web 服务器的重定向来执行此操作。或者您可以让请求通过 Web 服务器并在应用程序服务器层 (Django) 使用自定义中间件拦截它。这是一个例子。请注意,您不能使用Django 中内置的重定向应用程序,因为它只对路径进行操作,而您想要操作传入域本身。因此,您的选择是:调整您的 Web 服务器,或将中间件模块添加到您的 Django 项目。该ALLOWED_HOSTS设置与您的问题无关。旁白:您的问题有点令人困惑,因为您首先询问已删除的查询参数?page=3,然后转而询问域中的 www。如果您询问查询参数,请编辑您的问题,因为这保证了不同的答案。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python