如何在域中没有 "www" 的情况下获得 Django Absolute url?

How can I get Django Absolute url without "www" in domain?

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

{% 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 获得规范 url

这是我在 settings.pyALLOWED_HOST:

ALLOWED_HOSTS = [
    '127.0.0.1',
    'www.example.com',
    'example.com',
    'localhost',
]

如果没有 www,我如何获得有效的规范 url?

因为您使用的是 request.get_host,这将解析为用户在浏览器中键入的任何内容。您可能已将 DNS 记录设置为接受带或不带 www 的域。 Django 不关心它服务于哪个域,except/unless 您正在使用它的站点框架(您的示例代码不涉及站点框架,所以我猜您没有)。因此,Django 仅根据 URL 路径进行响应,而忽略域。

您是在问是否可以从入站请求中删除 "www"?当然,您可以在 Web 服务器(apache/nginx 等)层执行此操作,并使用特定于这些 Web 服务器的重定向。或者您可以让请求通过 Web 服务器并使用自定义中间件在应用程序服务器层 (Django) 拦截它。 Here 就是一个例子。

请注意,您不能使用 Django 内置的 Redirects 应用程序,因为它仅在路径上运行,而您想要操作传入域本身。

因此,您的选择是:调整您的 Web 服务器,或将中间件模块添加到您的 Django 项目。

ALLOWED_HOSTS 设置与您的问题无关。

旁白:您的问题有点令人困惑,因为您首先询问的是已删除的查询参数 ?page=3,然后您转而询问域中的 www。如果您询问查询参数,请编辑您的问题,因为这保证了不同的答案。