This is an automated email from the ASF dual-hosted git repository.
Yilialinn pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/apisix-website.git
The following commit(s) were added to refs/heads/master by this push:
new 0b0d4b30151 fix: repair dead-URL redirects and add 301s for removed
doc versions (#2072)
0b0d4b30151 is described below
commit 0b0d4b301519cc6484412ab1c348d0c36dd84cbf
Author: Ming Wen <[email protected]>
AuthorDate: Mon Jul 13 15:39:08 2026 +0800
fix: repair dead-URL redirects and add 301s for removed doc versions (#2072)
---
.htaccess | 87 ++++++++++++++++++++++++++++++++++++++++-----------------------
1 file changed, 55 insertions(+), 32 deletions(-)
diff --git a/.htaccess b/.htaccess
index 6e3e0cc22bc..369c473fdba 100644
--- a/.htaccess
+++ b/.htaccess
@@ -46,11 +46,11 @@ RedirectMatch 301 "^/zh/docs/apisix/getting-started/$"
"/zh/docs/apisix/getting-
RedirectMatch 301 "^/docs/apisix/3\.2/plugins/(.*)$"
"https://apache-apisix.netlify.app/docs/apisix/3.2/plugins/$1"
RedirectMatch 301 "^/zh/docs/apisix/3\.2/plugins/(.*)$"
"https://apache-apisix.netlify.app/zh/docs/apisix/3.2/plugins/$1"
-Redirect 301 "/docs/apisix/install" "/docs/apisix/how-to-build/"
-Redirect 301 "/docs/apisix/architecture-design/plugin/"
"/docs/apisix/architecture-design/plugin-config/"
-Redirect 301 "/docs/apisix/2.13/FAQ/plugins.md/"
"/docs/apisix/2.13/architecture-design/plugin/"
+Redirect 301 "/docs/apisix/install" "/docs/apisix/building-apisix/"
+Redirect 301 "/docs/apisix/architecture-design/plugin/"
"/docs/apisix/terminology/plugin-config/"
+Redirect 301 "/docs/apisix/2.13/FAQ/plugins.md/"
"/docs/apisix/terminology/plugin-config/"
Redirect 301
"/docs/ingress-controller/practices/proxy-the-httpbin-service-with-ingress"
"/docs/ingress-controller/tutorials/proxy-the-httpbin-service-with-ingress/"
-Redirect 301 "/docs/apisix/admin-api/terminology/plugin-config.md/"
"/docs/apisix/architecture-design/plugin-config/"
+Redirect 301 "/docs/apisix/admin-api/terminology/plugin-config.md/"
"/docs/apisix/terminology/plugin-config/"
Redirect 301 "/docs/general/community/" "/docs/general/join/"
Redirect 301 "/docs/general/subscribe-guide/" "/docs/general/join/"
@@ -62,11 +62,11 @@ Redirect 301
"/blog/2021/08/25/Auth-with-Casbin-in-Apache-APISIX/" "/blog/2021/0
Redirect 301 "/blog/2022/03/02/apisix-integration-graphql-plugin/"
"/blog/2022/03/02/apisix-integration-graphql/"
Redirect 301 "/blog/2022/09/21/apache-apisix-v3-preview"
"/blog/2022/11/02/apache-apisix-v3-preview"
-Redirect 301 "/zh/docs/apisix/install" "/zh/docs/apisix/how-to-build/"
-Redirect 301 "/zh/docs/apisix/architecture-design/plugin/"
"/zh/docs/apisix/architecture-design/plugin-config/"
-Redirect 301 "/zh/docs/apisix/2.13/FAQ/plugins.md/"
"/zh/docs/apisix/2.13/architecture-design/plugin/"
+Redirect 301 "/zh/docs/apisix/install" "/zh/docs/apisix/building-apisix/"
+Redirect 301 "/zh/docs/apisix/architecture-design/plugin/"
"/zh/docs/apisix/terminology/plugin-config/"
+Redirect 301 "/zh/docs/apisix/2.13/FAQ/plugins.md/"
"/zh/docs/apisix/terminology/plugin-config/"
Redirect 301
"/zh/docs/ingress-controller/practices/proxy-the-httpbin-service-with-ingress"
"/zh/docs/ingress-controller/tutorials/proxy-the-httpbin-service-with-ingress/"
-Redirect 301 "/zh/docs/apisix/admin-api/terminology/plugin-config.md/"
"/zh/docs/apisix/architecture-design/plugin-config/"
+Redirect 301 "/zh/docs/apisix/admin-api/terminology/plugin-config.md/"
"/zh/docs/apisix/terminology/plugin-config/"
Redirect 301 "/zh/docs/general/community/" "/zh/docs/general/join/"
Redirect 301 "/zh/docs/general/subscribe-guide/" "/zh/docs/general/join/"
@@ -77,31 +77,28 @@ Redirect 301
"/zh/blog/2021/11/30/use-apisix-ingress-in-kubesphere/httpbin.org/"
Redirect 301 "/zh/blog/2021/08/25/Auth-with-Casbin-in-Apache-APISIX/"
"/zh/blog/2021/08/18/auth-with-casbin-in-apache-apisix/"
Redirect 301 "/zh/blog/2022/03/02/apisix-integration-graphql-plugin/"
"/zh/blog/2022/03/02/apisix-integration-graphql/"
-Redirect 301 "/docs/ingress-controller/concepts/apisix_route/"
"/docs/ingress-controller/1.8.0/concepts/apisix_route/"
-Redirect 301 "/docs/ingress-controller/concepts/apisix_upstream/"
"/docs/ingress-controller/1.8.0/concepts/apisix_upstream/"
-Redirect 301 "/docs/ingress-controller/concepts/apisix_plugin_config/"
"/docs/ingress-controller/1.8.0/concepts/apisix_plugin_config/"
-Redirect 301 "/docs/ingress-controller/concepts/apisix_tls/"
"/docs/ingress-controller/1.8.0/concepts/apisix_tls/"
-Redirect 301 "/docs/ingress-controller/concepts/annotations/"
"/docs/ingress-controller/1.8.0/concepts/annotations/"
-Redirect 301 "/docs/ingress-controller/concepts/apisix_consumer/"
"/docs/ingress-controller/1.8.0/concepts/apisix_consumer/"
-Redirect 301 "/docs/ingress-controller/concepts/apisix_cluster_config/"
"/docs/ingress-controller/1.8.0/concepts/apisix_cluster_config/"
-Redirect 301 "/docs/ingress-controller/concepts/apisix_global_rule/"
"/docs/ingress-controller/1.8.0/concepts/apisix_global_rule/"
-Redirect 301 "/docs/ingress-controller/design/"
"/docs/ingress-controller/1.8.0/design/"
-Redirect 301 "/docs/ingress-controller/composite/"
"/docs/ingress-controller/1.8.0/composite/"
-Redirect 301 "/docs/ingress-controller/references/apisix_route_v2/"
"/docs/ingress-controller/1.8.0/references/apisix_route_v2/"
-Redirect 301 "/docs/ingress-controller/references/apisix_upstream/"
"/docs/ingress-controller/1.8.0/references/apisix_upstream/"
-Redirect 301 "/docs/ingress-controller/references/v2/"
"/docs/ingress-controller/1.8.0/references/v2/"
-Redirect 301 "/docs/ingress-controller/references/apisix_tls_v2/"
"/docs/ingress-controller/1.8.0/references/apisix_tls_v2/"
-Redirect 301 "/docs/ingress-controller/references/apisix_consumer_v2/"
"/docs/ingress-controller/1.8.0/references/apisix_consumer_v2/"
-Redirect 301 "/docs/ingress-controller/references/apisix_route_v2beta3/"
"/docs/ingress-controller/1.8.0/references/apisix_route_v2beta3/"
-RedirectMatch 301 "^/docs/ingress-controller/tutorials/(.*)$"
"/docs/ingress-controller/1.8.0/tutorials/$1"
-Redirect 301 "/docs/ingress-controller/monitoring/"
"/docs/ingress-controller/1.8.0/monitoring/"
-Redirect 301 "/docs/ingress-controller/plugins/prometheus/"
"/docs/ingress-controller/1.8.0/plugins/prometheus/"
-RedirectMatch 301 "^/docs/ingress-controller/deployments/(.*)$"
"/docs/ingress-controller/1.8.0/deployments/$1"
-Redirect 301 "/docs/ingress-controller/aeps/gateway-api/"
"/docs/ingress-controller/1.8.0/aeps/gateway-api/"
-Redirect 301 "/docs/ingress-controller/contribute/"
"/docs/ingress-controller/1.8.0/contribute/"
+# Ingress-controller pages from the pre-2.0 IA. These used to redirect to
+# 1.8.0, but only the newest release is built now, so 1.8.0 URLs 404 —
+# retarget to the closest page in the current IA. Stripped old-version URLs
+# from the rules further down land on these paths as their second hop (each
+# hop is a fresh request, re-evaluated from the top of this file).
+RedirectMatch 301
"^(/zh)?/docs/ingress-controller/concepts/(apisix_route|apisix_upstream|apisix_plugin_config|apisix_tls|apisix_consumer|apisix_cluster_config|apisix_global_rule)/$"
"$1/docs/ingress-controller/reference/apisix-ingress-controller/api-reference/"
+RedirectMatch 301 "^(/zh)?/docs/ingress-controller/concepts/annotations/$"
"$1/docs/ingress-controller/reference/apisix-ingress-controller/annotation/"
+RedirectMatch 301 "^(/zh)?/docs/ingress-controller/design/$"
"$1/docs/ingress-controller/concepts/deployment-architecture/"
+RedirectMatch 301 "^(/zh)?/docs/ingress-controller/composite/$"
"$1/docs/ingress-controller/overview/"
+RedirectMatch 301 "^(/zh)?/docs/ingress-controller/references/(.+)$"
"$1/docs/ingress-controller/reference/apisix-ingress-controller/api-reference/"
+RedirectMatch 301
"^(/zh)?/docs/ingress-controller/tutorials/proxy-the-httpbin-service(-with-ingress)?/$"
"$1/docs/ingress-controller/getting-started/configure-routes/"
+RedirectMatch 301
"^(/zh)?/docs/ingress-controller/tutorials/proxy-grpc-service/$"
"$1/docs/ingress-controller/getting-started/configure-routes/"
+RedirectMatch 301
"^(/zh)?/docs/ingress-controller/tutorials/enable-authentication-and-restriction/$"
"$1/docs/ingress-controller/getting-started/key-authentication/"
+RedirectMatch 301 "^(/zh)?/docs/ingress-controller/tutorials/the-hard-way/$"
"$1/docs/ingress-controller/getting-started/get-apisix-ingress-controller/"
+RedirectMatch 301 "^(/zh)?/docs/ingress-controller/tutorials/(.+)$"
"$1/docs/ingress-controller/overview/"
+RedirectMatch 301 "^(/zh)?/docs/ingress-controller/monitoring/$"
"$1/docs/ingress-controller/overview/"
+RedirectMatch 301 "^(/zh)?/docs/ingress-controller/plugins/prometheus/$"
"$1/docs/ingress-controller/overview/"
+RedirectMatch 301 "^(/zh)?/docs/ingress-controller/deployments/(.+)$"
"$1/docs/ingress-controller/install/"
+RedirectMatch 301 "^(/zh)?/docs/ingress-controller/aeps/gateway-api/$"
"$1/docs/ingress-controller/concepts/gateway-api/"
+RedirectMatch 301 "^(/zh)?/docs/ingress-controller/contribute/$"
"$1/docs/ingress-controller/developer-guide/"
Redirect 301
"/docs/ingress-controller/reference/apisix-ingress-controller/crd-reference/"
"/docs/ingress-controller/reference/apisix-ingress-controller/api-reference/"
-Redirect 301 "/docs/ingress-controller/FAQ/"
"/docs/ingress-controller/1.8.0/FAQ/"
-Redirect 301 "/docs/ingress-controller/upgrade/"
"/docs/ingress-controller/1.8.0/upgrade/"
+RedirectMatch 301 "^(/zh)?/docs/ingress-controller/upgrade/$"
"$1/docs/ingress-controller/upgrade-guide/"
Redirect 301 "/docs/ingress-controller/next/tutorials/the-hard-way/"
"/docs/ingress-controller/getting-started/get-apisix-ingress-controller/"
Redirect 301
"/docs/ingress-controller/next/tutorials/configure-ingress-with-gateway-api/"
"/docs/ingress-controller/concepts/gateway-api/"
@@ -141,3 +138,29 @@ RedirectMatch 301 "^/docs/general/code-samples/?$" "/"
RedirectMatch 301 "^/zh/docs/general/code-samples/?$" "/zh/"
RedirectMatch 301 "^/help/?$" "/"
RedirectMatch 301 "^/zh/help/?$" "/zh/"
+
+# --- Dead-URL cleanup (sourced from Matomo 404 inventory, 2026-06-14..07-11)
---
+
+# Old sub-project doc versions are no longer built (only the newest release is
+# published) — strip the version segment. Renamed pages then land on the
+# retargeting rules above as a second hop. The apisix project itself is NOT
+# covered here: its 3.10+ versions are still built, and 2.x/3.x legacy
+# redirects for it are handled at the infra layer.
+RedirectMatch 301 "^(/zh)?/docs/ingress-controller/[01]\.\d+\.\d+/(.*)$"
"$1/docs/ingress-controller/$2"
+RedirectMatch 301
"^(/zh)?/docs/docker/(?:apisix-(?:dashboard-)?)?\d+\.\d+(?:\.\d+)?/(.+)$"
"$1/docs/docker/$2"
+RedirectMatch 301 "^(/zh)?/docs/apisix/2\.[1-5](?:\.\d+)?/(.+)$"
"$1/docs/apisix/$2"
+
+# Dashboard docs were removed from the site entirely
+RedirectMatch 301 "^(/zh)?/docs/dashboard(/.*)?$" "$1/docs/apisix/dashboard/"
+
+# Bare landing directories have no index page and return 403 — send visitors
+# to the real entry pages instead
+RedirectMatch 301 "^(/zh)?/docs/apisix/$"
"$1/docs/apisix/getting-started/README/"
+RedirectMatch 301 "^(/zh)?/docs/apisix/plugins/$" "$1/plugins/"
+RedirectMatch 301 "^(/zh)?/docs/apisix/3\.\d+/getting-started/$"
"$1/docs/apisix/getting-started/README/"
+RedirectMatch 301 "^(/zh)?/docs/ingress-controller/$"
"$1/docs/ingress-controller/overview/"
+RedirectMatch 301
"^(/zh)?/docs/ingress-controller/(?:next/)?getting-started/$"
"$1/docs/ingress-controller/getting-started/get-apisix-ingress-controller/"
+
+# Renamed docs and GitHub-repo-style paths that leak into search results
+RedirectMatch 301 "^(/zh)?/docs/apisix/stand-alone/?$"
"$1/docs/apisix/deployment-modes/"
+RedirectMatch 301 "^(/zh)?/docs/apisix/en/latest/deployment-modes(\.md)?/?$"
"$1/docs/apisix/deployment-modes/"