From db0b50089b829d22fd2a09336b1824d2c7d2a718 Mon Sep 17 00:00:00 2001 From: Lauryn Menard Date: Mon, 6 Oct 2025 13:02:11 +0200 Subject: [PATCH] templates: Add rel-canonical link to documentation pages. Updates templates/zerver/meta_tags.html to add a rel-canonical link if REL_CANONICAL_LINK is in the template context dict. We add REL_CANONICAL_LINK to the documentation context for the help center, API and integrations documentation pages in all cases. For policies documentation pages, we add REL_CANONICAL_LINK to the context only when settings.CORPORATE_ENABLED is true, so that self-hosted servers' policies documentation do not have a rel-canonical link set. --- templates/zerver/meta_tags.html | 3 +++ zerver/views/documentation.py | 10 ++++++++++ 2 files changed, 13 insertions(+) diff --git a/templates/zerver/meta_tags.html b/templates/zerver/meta_tags.html index 8e92dca24e..aa1168b49c 100644 --- a/templates/zerver/meta_tags.html +++ b/templates/zerver/meta_tags.html @@ -1,4 +1,7 @@ +{% if REL_CANONICAL_LINK %} + +{% endif %} {% if allow_search_engine_indexing %} {% if PAGE_DESCRIPTION %} diff --git a/zerver/views/documentation.py b/zerver/views/documentation.py index 9f952b05e8..c376c6c4ce 100644 --- a/zerver/views/documentation.py +++ b/zerver/views/documentation.py @@ -75,6 +75,10 @@ def add_api_url_context( context["html_settings_links"] = html_settings_links +def add_canonical_link_context(context: dict[str, Any], request: HttpRequest) -> None: + context["REL_CANONICAL_LINK"] = f"https://zulip.com{request.path}" + + class ApiURLView(TemplateView): @override def get_context_data(self, **kwargs: Any) -> dict[str, str]: @@ -209,6 +213,7 @@ class MarkdownDirectoryView(ApiURLView): sidebar_article = self.get_path("include/sidebar_index") sidebar_index = sidebar_article.article_path title_base = "Zulip help center" + add_canonical_link_context(context, self.request) elif self.policies_view: context["page_is_policy_center"] = True context["doc_root"] = "/policies/" @@ -219,6 +224,9 @@ class MarkdownDirectoryView(ApiURLView): else: sidebar_index = None title_base = "Zulip terms and policies" + # We don't add a rel-canonical link to self-hosted server policies docs. + if settings.CORPORATE_ENABLED: + add_canonical_link_context(context, self.request) elif self.api_doc_view: context["page_is_api_center"] = True context["doc_root"] = "/api/" @@ -226,6 +234,7 @@ class MarkdownDirectoryView(ApiURLView): sidebar_article = self.get_path("sidebar_index") sidebar_index = sidebar_article.article_path title_base = "Zulip API documentation" + add_canonical_link_context(context, self.request) else: raise AssertionError("Invalid documentation view type") @@ -383,6 +392,7 @@ class IntegrationView(ApiURLView): context: dict[str, Any] = super().get_context_data(**kwargs) add_integrations_context(context) add_integrations_open_graph_context(context, self.request) + add_canonical_link_context(context, self.request) add_google_analytics_context(context) return context