为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

眼眸繁星 2021-06-01 13:53:32
我尝试向我的 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?
查看完整描述

1 回答

?
慕码人2483693

TA贡献1860条经验 获得超9个赞

因为您正在使用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。如果您询问查询参数,请编辑您的问题,因为这保证了不同的答案。


查看完整回答
反对 回复 2021-06-09
  • 1 回答
  • 0 关注
  • 105 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信