【发布时间】:2017-01-27 18:11:29
【问题描述】:
我在博客索引页面上使用 Wagtail 1.8 和 pageurl 模板标签将博客的标题超链接到实际的博客页面。很标准的东西。这是一个 Django 1.10 项目。
<a class="blog-post-link" href="{% pageurl blog %}">
<h2>{{ blog.title }}</h2>
</a>
我遇到的一个非常奇怪的问题是,站点的主机名被替换为托管该站点的服务器的主机名。例如,正确的链接是:
https://beadtrails.com/blog/vernon-bc-what-to-do-on-and-off-the-trails/
但是,它有时会返回为https://graphicearth.ca/blog/vernon-bc-what-to-do-on-and-off-the-trails/
当我说有时,如果我去 wagtail 管理站点页面,然后进入主机记录并保存它,它会解决问题 - 一段时间。然后它将恢复到不正确的 url。
您可以想象,如果您的博客链接以 404 错误结尾,这并不是一个很好的情况!
为了解决问题,我检查了 Wagtail 和 Django 站点表的配置,检查了配置文件是否正确识别 SITE_ID,对“graphicearth.ca”的所有源代码进行了文本搜索,查看了 uWSGI 和nginx 配置文件,检查 Wagtail 中相对于主页的博客层次结构是否正确,检查浏览器中的标题以确保传递了正确的主机。一切看起来都不错。
挖掘模板标签的源代码,在 wagtailcore_tags.py 中,函数的 cmets 说:
如果页面的 URL 位于相同的范围内,则将其输出为相对 (/foo/bar/) 站点作为当前页面,或者绝对 (http://example.com/foo/bar/) 如果 不是。
因此,出于某种原因,代码最终会认为站点是不同的——但并非总是如此。如上所述,如果我进入 Wagtail 管理员并重新保存站点条目,它会修复一段时间。
由于这是在生产系统上,因此很难调试。是否有人对可能导致此问题的原因和/或如何调试有任何建议?
应用程序堆栈是: - Django 1.10.5 - 鹡鸰 1.8 - uWSGI - nginx
答案更新: 汤姆的回答让我找到了解决方案,所以我将他的回答标记为正确。我为多个站点使用了相同的 memcached 实例,并且密钥必须被交叉。我恢复到基本的 django 缓存,它解决了问题。是时候为同一服务器上的多个站点寻找更好的缓存解决方案了。
【问题讨论】: