This is an automated email from the ASF dual-hosted git repository.

yilialin 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 ae904b434e9 fix(blog): remove external canonical URLs from 57 blog 
posts (#2015)
ae904b434e9 is described below

commit ae904b434e9f66045a31618bde309053163eeef6
Author: Ming Wen <[email protected]>
AuthorDate: Fri Apr 10 09:40:30 2026 +0800

    fix(blog): remove external canonical URLs from 57 blog posts (#2015)
---
 blog/en/blog/2021/11/17/dapr-with-apisix.md                        | 5 -----
 blog/en/blog/2021/12/10/integrate-keycloak-auth-in-apisix.md       | 5 -----
 blog/en/blog/2022/02/28/apisix-integration-opentelemetry-plugin.md | 5 -----
 blog/en/blog/2022/08/08/apache-apisix-performance-test-in-azure.md | 5 -----
 .../2022/08/12/arm-performance-google-aws-azure-with-apisix.md     | 5 -----
 blog/en/blog/2022/08/17/backend-for-frontend-demo.md               | 7 -------
 blog/en/blog/2022/09/09/kubernetes-ingress-with-apisix.md          | 5 -----
 .../blog/2022/09/13/why-is-apache-apisix-the-best-api-gateway.md   | 5 -----
 blog/en/blog/2022/09/28/rust-loves-apisix.md                       | 5 -----
 blog/en/blog/2022/10/05/rust-apisix.md                             | 5 -----
 blog/en/blog/2022/11/09/georouting-apisix.md                       | 5 -----
 blog/en/blog/2022/11/23/poor-man-api.md                            | 5 -----
 blog/en/blog/2022/12/06/choose-the-right-api-style-technology.md   | 5 -----
 blog/en/blog/2022/12/07/web-caching-client.md                      | 5 -----
 blog/en/blog/2022/12/14/web-caching-server.md                      | 5 -----
 blog/en/blog/2023/02/09/secure-apisix-admin.md                     | 5 -----
 blog/en/blog/2023/02/23/right-feature-right-place.md               | 5 -----
 blog/en/blog/2023/03/02/security-policy-auditable.md               | 5 -----
 blog/en/blog/2023/03/09/authenticate-openid-connect.md             | 5 -----
 blog/en/blog/2023/03/16/grpc-client-side.md                        | 5 -----
 blog/en/blog/2023/03/23/mtls-everywhere.md                         | 5 -----
 blog/en/blog/2023/04/14/10-api-management-trends-2023.md           | 1 -
 blog/en/blog/2023/05/04/apache-apisix-chaos-engineering.md         | 1 -
 .../en/blog/2023/05/19/why-do-microservices-need-an-api-gateway.md | 1 -
 blog/en/blog/2023/06/12/how-is-apisix-fast.md                      | 1 -
 blog/en/blog/2023/06/30/apisix-mqtt-proxy.md                       | 5 -----
 blog/en/blog/2023/07/07/tiny-apisix-plugin.md                      | 5 -----
 blog/en/blog/2023/07/09/apisix-integrates-with-vault.md            | 1 -
 blog/en/blog/2023/07/27/apisix-without-etcd.md                     | 5 -----
 blog/en/blog/2023/08/14/rate-limit.md                              | 5 -----
 blog/en/blog/2023/08/17/ops-friendly-apisix.md                     | 5 -----
 blog/en/blog/2023/09/28/rabbit-hole-apisix-plugin.md               | 5 -----
 blog/en/blog/2023/10/05/resize-images-on-the-fly.md                | 5 -----
 blog/en/blog/2023/11/09/api-versioning.md                          | 5 -----
 blog/en/blog/2023/11/30/chopping-monolith-smarter-way.md           | 5 -----
 blog/en/blog/2023/12/07/canary-releases-apisix.md                  | 5 -----
 .../blog/2023/12/14/apisix-plugins-priority-leaky-abstraction.md   | 5 -----
 blog/en/blog/2024/02/13/apisix-owasp-coraza-core-ruleset.md        | 5 -----
 blog/en/blog/2024/02/20/secure-api-practices-apisix-1.md           | 5 -----
 blog/en/blog/2024/02/27/secure-api-practices-apisix-2.md           | 5 -----
 blog/en/blog/2024/03/28/apisix-north-america-tour.md               | 5 -----
 blog/en/blog/2024/04/04/fix-duplicate-api-requests.md              | 5 -----
 blog/en/blog/2024/04/11/implement-idempotency-key-apisix.md        | 5 -----
 blog/en/blog/2024/05/02/pass-parameters-apisix.md                  | 5 -----
 blog/en/blog/2024/06/06/even-more-opentelemetry.md                 | 5 -----
 blog/en/blog/2024/06/13/fixed-routes-apisix.md                     | 5 -----
 blog/en/blog/2024/07/11/watermarking-infrastructure.md             | 5 -----
 blog/en/blog/2024/07/18/advanced-url-rewrite-apisix.md             | 5 -----
 blog/en/blog/2024/07/25/different-rate-limits-apisix.md            | 5 -----
 blog/en/blog/2024/08/01/free-tier-api-apisix.md                    | 5 -----
 blog/en/blog/2024/10/22/apisix-integrates-with-open-appsec.md      | 5 -----
 blog/en/blog/2025/02/06/analyzing-api-gateway-adoption-rates.md    | 5 -----
 blog/en/blog/2025/02/21/why-reinvent-api-gateways.md               | 5 -----
 blog/zh/blog/2021/11/17/dapr-with-apisix.md                        | 5 -----
 blog/zh/blog/2021/12/10/integrate-keycloak-auth-in-apisix.md       | 5 -----
 blog/zh/blog/2022/02/28/apisix-integration-opentelemetry-plugin.md | 5 -----
 blog/zh/blog/2022/09/27/why-apache-apisix-is-best-apigateway.md    | 5 -----
 57 files changed, 267 deletions(-)

diff --git a/blog/en/blog/2021/11/17/dapr-with-apisix.md 
b/blog/en/blog/2021/11/17/dapr-with-apisix.md
index ee351340804..56f63716b62 100644
--- a/blog/en/blog/2021/11/17/dapr-with-apisix.md
+++ b/blog/en/blog/2021/11/17/dapr-with-apisix.md
@@ -17,11 +17,6 @@ image: 
https://static.apiseven.com/2022/blog/0818/ecosystem/dapr.png
 > This article will show you how to create an Apache APISIX controller by 
 > integrating Dapr, includes the concept of the project and the specific 
 > operation steps.
 
 <!--truncate-->
-
-<head>
-    <link rel="canonical" 
href="https://blog.dapr.io/posts/2022/01/13/enable-dapr-with-apache-apisix-ingress-controller/";
 />
-</head>
-
 Essentially, the Apache APISIX controller will configure the same standard 
DAPR annotations to inject DAPRD sidecar. Exposing this sidecar allows external 
applications to communicate with applications in the cluster that have Dapr 
enabled.
 
 The following diagram shows the architectural flow of the actual project:
diff --git a/blog/en/blog/2021/12/10/integrate-keycloak-auth-in-apisix.md 
b/blog/en/blog/2021/12/10/integrate-keycloak-auth-in-apisix.md
index 23edb78ec86..cb6dcc81da8 100644
--- a/blog/en/blog/2021/12/10/integrate-keycloak-auth-in-apisix.md
+++ b/blog/en/blog/2021/12/10/integrate-keycloak-auth-in-apisix.md
@@ -23,11 +23,6 @@ image: 
https://static.apiseven.com/2022/blog/0818/plugins/keycloak.png
 > This article shows you how to use OpenID-Connect protocol and Keycloak for 
 > identity authentication in Apache APISIX through detailed steps.
 
 <!--truncate-->
-
-<head>
-    <link rel="canonical" href="https://www.keycloak.org/2021/12/apisix"; />
-</head>
-
 ![Keycloak-APISIX 
Integration](https://static.apiseven.com/202108/1639129658486-393e8a3a-ccf2-496d-9b46-4db741bd6e55.png)
 
 [Keycloak](https://www.keycloak.org/) is an open source identity and access 
management solution for modern applications and services. Keycloak supports 
Single-Sign On, which enables services to interface with Keycloak through 
protocols such as OpenID Connect, OAuth 2.0, etc. Keycloak also supports 
integrations with different authentication services, such as Github, Google and 
Facebook.
diff --git a/blog/en/blog/2022/02/28/apisix-integration-opentelemetry-plugin.md 
b/blog/en/blog/2022/02/28/apisix-integration-opentelemetry-plugin.md
index 1528a03e8db..3dfe2e666c7 100644
--- a/blog/en/blog/2022/02/28/apisix-integration-opentelemetry-plugin.md
+++ b/blog/en/blog/2022/02/28/apisix-integration-opentelemetry-plugin.md
@@ -23,11 +23,6 @@ image: 
https://static.apiseven.com/2022/blog/0818/plugins/opentelemetry.png
 > This article introduces you to the Apache APISIX `opentelemetry` plugin 
 > concept and how to enable and deploy the `opentelemetry` plugin.
 
 <!--truncate-->
-
-<head>
-    <link rel="canonical" href="https://opentelemetry.io/blog/2022/apisix/"; />
-</head>
-
 ## Background Information
 
 Apache APISIX is a dynamic, real-time, high-performance API gateway that 
provides rich traffic management features such as load balancing, dynamic 
upstream, canary release, circuit breaking, authentication, observability, and 
more. It not only has many useful plugins, but also supports plugin dynamic 
change and hot swap.
diff --git a/blog/en/blog/2022/08/08/apache-apisix-performance-test-in-azure.md 
b/blog/en/blog/2022/08/08/apache-apisix-performance-test-in-azure.md
index 2a077e3c2a1..7ec33995ad9 100644
--- a/blog/en/blog/2022/08/08/apache-apisix-performance-test-in-azure.md
+++ b/blog/en/blog/2022/08/08/apache-apisix-performance-test-in-azure.md
@@ -23,11 +23,6 @@ image: 
https://static.apiseven.com/2022/10/28/635b53794f32a.png
 > This article uses API Gateway Apache APISIX to compare the performance of 
 > Azure Ddsv5 and Azure Dpdsv5 in network IO-intensive scenarios.
 
 <!--truncate-->
-
-<head>
-    <link rel="canonical" 
href="https://api7.ai/2022/08/08/apache-apisix-performance-test-in-azure/"; />
-</head>
-
 ## Background
 
 In April, Microsoft announced a preview of its family of Azure virtual 
machines based on Ampere® Altra® Arm processors. The new VM series includes 
general-purpose Dpsv5 and memory-optimized Epsv5 VMs. For details, refer to the 
following figure:
diff --git 
a/blog/en/blog/2022/08/12/arm-performance-google-aws-azure-with-apisix.md 
b/blog/en/blog/2022/08/12/arm-performance-google-aws-azure-with-apisix.md
index 09e30149d75..29910c4b234 100644
--- a/blog/en/blog/2022/08/12/arm-performance-google-aws-azure-with-apisix.md
+++ b/blog/en/blog/2022/08/12/arm-performance-google-aws-azure-with-apisix.md
@@ -29,11 +29,6 @@ image: 
https://static.apiseven.com/2022/10/18/634e6963ea45f.png
 > This article uses  Apache APISIX to compare the performance of AWS, Google, 
 > Azure, and Oracle ARM-based servers in network IO-intensive scenarios.
 
 <!--truncate-->
-
-<head>
-    <link rel="canonical" 
href="https://api7.ai/2022/08/12/arm-performance-google-aws-azure-with-apisix/"; 
/>
-</head>
-
 ## Background
 
 The ARM architecture is a member of the [RISC (Reduced instruction set 
computer)](https://en.wikipedia.org/wiki/Reduced_instruction_set_computer) 
design family. The RISC microprocessor architecture design enables small 
processors to efficiently handle complex tasks by using a set of highly 
optimized instructions. Being widely used in many embedded system designs, the 
ARM architecture has become the cornerstone of the world’s largest computing 
ecosystem and mobile devices. Many experts re [...]
diff --git a/blog/en/blog/2022/08/17/backend-for-frontend-demo.md 
b/blog/en/blog/2022/08/17/backend-for-frontend-demo.md
index 91bd61df215..3b707a0fcb2 100644
--- a/blog/en/blog/2022/08/17/backend-for-frontend-demo.md
+++ b/blog/en/blog/2022/08/17/backend-for-frontend-demo.md
@@ -18,11 +18,6 @@ image: 
https://static.apiseven.com/2022/11/03/63634494405e7.png
 > This article describes a demo code to implement the Backend-For-Frontend 
 > pattern.
 
 <!--truncate-->
-
-<head>
-    <link rel="canonical" 
href="https://blog.frankel.ch/backend-for-frontend-demo/"; />
-</head>
-
 In [one of my earlier posts](https://blog.frankel.ch/backend-for-frontend/), I 
described the Backend-for-Frontend pattern. In short, it offers a single facade 
over multiple backend parts. Moreover, it provides each client type, _e.g._ 
desktop, mobile, exactly the data that it needs and not more in the format 
required by this client type.
 
 ## The use-case
@@ -77,7 +72,6 @@ Here's the code for each microservice:
 def info():
     return debug                 #1
 
-
 @app.route("/products")
 def get_products():
     return jsonify(products)     #2
@@ -91,7 +85,6 @@ def get_products():
 def info():
     return debug                 #1
 
-
 @app.route("/news")
 def get_news():
     return jsonify(news)         #1
diff --git a/blog/en/blog/2022/09/09/kubernetes-ingress-with-apisix.md 
b/blog/en/blog/2022/09/09/kubernetes-ingress-with-apisix.md
index 65134b08be4..5c92fdd2c30 100644
--- a/blog/en/blog/2022/09/09/kubernetes-ingress-with-apisix.md
+++ b/blog/en/blog/2022/09/09/kubernetes-ingress-with-apisix.md
@@ -18,11 +18,6 @@ image: 
https://static.apiseven.com/2022/09/05/6315bd71d6846.png
 > A tutorial on using Ingress in your Kubernetes cluster with Apache APISIX.
 
 <!--truncate-->
-
-<head>
-    <link rel="canonical" 
href="https://navendu.me/posts/hands-on-set-up-ingress-on-kubernetes-with-apache-apisix-ingress-controller/";
 />
-</head>
-
 In Kubernetes, 
[Ingress](https://kubernetes.io/docs/concepts/services-networking/ingress/) is 
a native object that allows you to access your services externally by defining 
a set of rules. Using a reverse proxy, an [Ingress 
controller](https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/)
 implements these defined rules and routes external traffic to your services.
 
 ![Ingress controller](https://static.apiseven.com/2022/09/05/6315bd0573d30.jpg)
diff --git 
a/blog/en/blog/2022/09/13/why-is-apache-apisix-the-best-api-gateway.md 
b/blog/en/blog/2022/09/13/why-is-apache-apisix-the-best-api-gateway.md
index 8e4f424fe01..e9bec6cc17d 100644
--- a/blog/en/blog/2022/09/13/why-is-apache-apisix-the-best-api-gateway.md
+++ b/blog/en/blog/2022/09/13/why-is-apache-apisix-the-best-api-gateway.md
@@ -19,11 +19,6 @@ image: 
https://static.apiseven.com/2022/11/05/6365f2b8be5a7.png
 > Why is Apache APISIX the best API Gateway? We will compare multiple API 
 > gateways (Kong, Tyk, Gloo) in terms of the popularity among developers, 
 > their open source licenses, their performances, and the ecosystem as a whole.
 
 <!--truncate-->
-
-<head>
-  <link rel="canonical" 
href="https://api7.ai/blog/why-is-apache-apisix-the-best-api-gateway"; />
-</head>
-
 > This post was first published at 
 > [API7.ai](https://api7.ai/blog/why-is-apache-apisix-the-best-api-gateway/) 
 > by [Ming Wen](https://github.com/moonming).
 
 Nowadays, mobile phones are used for all sorts of things, and various 
applications are available on the AppStore including social media, utility, 
games, lifestyle, online shopping, etc. Building these apps is inseparable from 
APIs. Therefore, companies that provide services through APIs must choose a 
reliable API gateway to ensure their services’ speed, stability, and security.
diff --git a/blog/en/blog/2022/09/28/rust-loves-apisix.md 
b/blog/en/blog/2022/09/28/rust-loves-apisix.md
index d18302d5f1e..6ddb7f2813d 100644
--- a/blog/en/blog/2022/09/28/rust-loves-apisix.md
+++ b/blog/en/blog/2022/09/28/rust-loves-apisix.md
@@ -18,11 +18,6 @@ image: 
https://static.apiseven.com/2022/10/08/634113b161cce.png
 > This article shows the steps to perform to develop and deploy WebAssembly 
 > plugins from Rust.
 
 <!--truncate-->
-
-<head>
-    <link rel="canonical" href="https://blog.frankel.ch/rust-apisix/1/"; />
-</head>
-
 Apache APISIX is built upon the shoulders of two giants:
 
 * [NGINX](https://www.nginx.com/), a widespread Open Source reverse-proxy
diff --git a/blog/en/blog/2022/10/05/rust-apisix.md 
b/blog/en/blog/2022/10/05/rust-apisix.md
index 945c3f00dfb..88d93d6b11b 100644
--- a/blog/en/blog/2022/10/05/rust-apisix.md
+++ b/blog/en/blog/2022/10/05/rust-apisix.md
@@ -18,11 +18,6 @@ image: 
https://static.apiseven.com/2022/10/28/635b5378cdd1f.png
 > This article describes how to redevelop the response-rewrite plugin using 
 > Rust and WebAssembly.
 
 <!--truncate-->
-
-<head>
-    <link rel="canonical" href="https://blog.frankel.ch/rust-apisix/2/"; />
-</head>
-
 Last week, I described the basics on [how to develop and deploy a Rust plugin 
for Apache APISIX](https://blog.frankel.ch/rust-apisix/1/). The plugin just 
logged a message when it received the request. Today, I want to leverage what 
we learned to create something more valuable: write part of the 
[response-rewrite](https://apisix.apache.org/docs/apisix/plugins/response-rewrite/)
 plugin with Rust.
 
 ## Adding a hard-coded header
diff --git a/blog/en/blog/2022/11/09/georouting-apisix.md 
b/blog/en/blog/2022/11/09/georouting-apisix.md
index a3f87061471..f4cc003c70b 100644
--- a/blog/en/blog/2022/11/09/georouting-apisix.md
+++ b/blog/en/blog/2022/11/09/georouting-apisix.md
@@ -17,11 +17,6 @@ image: 
https://repository-images.githubusercontent.com/560493734/4073382d-d3de-4
 > Apache APISIX, the Apache-led API Gateway, comes out of the box with many 
 > plugins to implement your use case. Sometimes, however, the plugin you're 
 > looking for is not available. While creating your own is always possible, 
 > it's sometimes necessary. Today, I'll show you how to route users according 
 > to their location without writing a single line of Lua code.
 
 <!--truncate-->
-
-<head>
-    <link rel="canonical" href="https://blog.frankel.ch/georouting-apisix/"; />
-</head>
-
 ## Why geo-routing?
 
 Geo-routing is to forward HTTP requests based on a user's physical location, 
inferred from their IP. There are many reasons to do that, and here is a couple 
of them.
diff --git a/blog/en/blog/2022/11/23/poor-man-api.md 
b/blog/en/blog/2022/11/23/poor-man-api.md
index 353111ab760..49d127ccafd 100644
--- a/blog/en/blog/2022/11/23/poor-man-api.md
+++ b/blog/en/blog/2022/11/23/poor-man-api.md
@@ -19,11 +19,6 @@ image: 
https://static.apiseven.com/2022/11/28/63841cb4ad10a.png
 > Creating a full-fledged API requires resources, both time and money. You 
 > need to think about the model, the design, the REST principles, etc., 
 > without writing a single line of code. Most of the time, you don't know 
 > whether it's worth it: you'd like to offer a Minimum Viable Product and 
 > iterate from there. I want to show how you can achieve it without writing a 
 > single line of code.
 
 <!--truncate-->
-
-<head>
-    <link rel="canonical" href="https://blog.frankel.ch/poor-man-api/"; />
-</head>
-
 ## The solution
 
 The main requirement of the solution is to use the [PostgreSQL 
database](https://www.postgresql.org/). It's a well-established Open Source SQL 
database.
diff --git a/blog/en/blog/2022/12/06/choose-the-right-api-style-technology.md 
b/blog/en/blog/2022/12/06/choose-the-right-api-style-technology.md
index 4998e323302..03d1cf6946e 100644
--- a/blog/en/blog/2022/12/06/choose-the-right-api-style-technology.md
+++ b/blog/en/blog/2022/12/06/choose-the-right-api-style-technology.md
@@ -19,11 +19,6 @@ image: 
https://static.apiseven.com/2022/12/06/638e30968ec3e.png
 > In this post, we’ll go through **the 5 most popular API styles** and look at 
 > very common questions like “_How to decide on the right API style and which 
 > technology to choose for a style_” and provide practical scenarios where an 
 > [API 
 > Gateway](https://apisix.apache.org/docs/apisix/terminology/api-gateway/) can 
 > supplement their weaknesses.
 
 <!--truncate-->
-
-<head>
-    <link rel="canonical" 
href="https://iambobur.com/2022/12/06/how-to-choose-the-right-api-style-and-technology/";
 />
-</head>
-
 ## No best API style
 
 [API](https://en.wikipedia.org/wiki/API)s are an essential design element in 
any software architecture that interconnects components digitally and allows 
various systems and devices to communicate easily with each other.  When we 
built a new API, initially we think about the API design, and how the API 
interacts with the external world by using which **style and technology**.
diff --git a/blog/en/blog/2022/12/07/web-caching-client.md 
b/blog/en/blog/2022/12/07/web-caching-client.md
index 14826610bf6..e590e30e8e5 100644
--- a/blog/en/blog/2022/12/07/web-caching-client.md
+++ b/blog/en/blog/2022/12/07/web-caching-client.md
@@ -18,11 +18,6 @@ image: 
https://static.apiseven.com/2022/12/13/63981dcbe4b0c.jpg
 >The subject of Web resource caching is as old as the World Wide Web itself. 
 >However, I'd like to offer an as-exhaustive-as-possible catalog of how one 
 >can improve performance by caching. Web resource caching can happen in two 
 >different places: client-side - on the browser and server-side. This post is 
 >dedicated to the former; the next post will focus on the latter.
 
 <!--truncate-->
-
-<head>
-    <link rel="canonical" href="https://blog.frankel.ch/web-caching/client/"; />
-</head>
-
 ## Caching 101
 
 The idea behind caching is simple: if a resource is a time- or 
resource-consuming to compute, do it once and store the result. When somebody 
requests the resource afterward, return the stored result instead of computing 
it a second time. It looks simple - and it is, but the devil is in the detail, 
as they say.
diff --git a/blog/en/blog/2022/12/14/web-caching-server.md 
b/blog/en/blog/2022/12/14/web-caching-server.md
index e2ce189729d..a2891fe87e6 100644
--- a/blog/en/blog/2022/12/14/web-caching-server.md
+++ b/blog/en/blog/2022/12/14/web-caching-server.md
@@ -18,11 +18,6 @@ image: 
https://static.apiseven.com/2022/12/13/63981be362ec4.jpg
 >The subject of Web resource caching is as old as the World Wide Web itself. 
 >However, I'd like to offer an as-exhaustive-as-possible catalog of how one 
 >can improve performance by caching. Web resource caching can happen in two 
 >different places: client-side - on the browser and server side. In the 
 >[previous post](https://blog.frankel.ch/web-caching/client/), I explained the 
 >former; this post focuses on the latter.
 
 <!--truncate-->
-
-<head>
-    <link rel="canonical" href="https://blog.frankel.ch/web-caching/server/"; />
-</head>
-
 While client-side caching works well, it has one central issue: to serve the 
resource locally, it must first have it in the cache. Thus, each client needs 
its cached resource. If the requested resource is intensive to compute, it 
doesn't scale. The idea behind server-side caching is to compute the resource 
once and serve it from the cache to all clients.
 
 ![Server-side cache 
principle](https://blog.frankel.ch/assets/generated/web-caching/server-cache.svg)
diff --git a/blog/en/blog/2023/02/09/secure-apisix-admin.md 
b/blog/en/blog/2023/02/09/secure-apisix-admin.md
index e1507c1906d..0c0a78df2af 100644
--- a/blog/en/blog/2023/02/09/secure-apisix-admin.md
+++ b/blog/en/blog/2023/02/09/secure-apisix-admin.md
@@ -17,11 +17,6 @@ image: 
https://static.apiseven.com/uploads/2023/02/09/GCYH53g6_security-g85f9e28
 > API Gateways are critical components in one's infrastructure. If an attacker 
 > could change the configuration of routes, they could direct traffic to their 
 > infrastructure. Consequences could range from data theft to financial 
 > losses. Worse, data theft could only be noticed after a long time by 
 > mirroring the load. Hence, protecting your API Gateway is of utmost 
 > importance.
 
 <!--truncate-->
-
-<head>
-    <link rel="canonical" href="https://blog.frankel.ch/secure-apisix-admin/"; 
/>
-</head>
-
 In this short blog post, I'll list a couple of ways to secure your [Apache 
APISIX](https://apisix.apache.org/) admin access.
 
 ## Change admin tokens
diff --git a/blog/en/blog/2023/02/23/right-feature-right-place.md 
b/blog/en/blog/2023/02/23/right-feature-right-place.md
index a391f612d24..40ff3a471bb 100644
--- a/blog/en/blog/2023/02/23/right-feature-right-place.md
+++ b/blog/en/blog/2023/02/23/right-feature-right-place.md
@@ -29,11 +29,6 @@ image: 
https://static.apiseven.com/uploads/2023/03/01/UTBANOhW_choice-geedae7b7e
 >It seems logical that people in this situation try to solve problems with the 
 >solutions they are most familiar with. However, it doesn't mean it's the best 
 >approach. It's a bad one in most cases.
 
 <!--truncate-->
-
-<head>
-    <link rel="canonical" 
href="https://blog.frankel.ch/right-feature-right-place/"; />
-</head>
-
 ## A concrete example
 
 Imagine an API application. It runs on the JVM, and it's written in the 
"Reactive" style with the help of the Spring Boot framework.
diff --git a/blog/en/blog/2023/03/02/security-policy-auditable.md 
b/blog/en/blog/2023/03/02/security-policy-auditable.md
index 1ccee58b212..0f456de892a 100644
--- a/blog/en/blog/2023/03/02/security-policy-auditable.md
+++ b/blog/en/blog/2023/03/02/security-policy-auditable.md
@@ -20,11 +20,6 @@ image: 
https://static.apiseven.com/uploads/2023/06/08/pzULiHZO_opa-horizontal-co
 >Last week, I wrote about [putting the right feature at the right 
 >place](https://blog.frankel.ch/right-feature-right-place/). I used rate 
 >limiting as an example, moving it from a library inside the application to 
 >the API Gateway. Today, I'll use another example: authentication and 
 >authorization.
 
 <!--truncate-->
-
-<head>
-    <link rel="canonical" 
href="https://blog.frankel.ch/security-policy-auditable/"; />
-</head>
-
 ## Securing a Spring Boot application
 
 I'll keep using Spring Boot in the following because I'm familiar with it. The 
Spring Boot application offers a REST endpoint to check employees' salaries.
diff --git a/blog/en/blog/2023/03/09/authenticate-openid-connect.md 
b/blog/en/blog/2023/03/09/authenticate-openid-connect.md
index d31c714842e..0ab6a918a83 100644
--- a/blog/en/blog/2023/03/09/authenticate-openid-connect.md
+++ b/blog/en/blog/2023/03/09/authenticate-openid-connect.md
@@ -19,11 +19,6 @@ image: 
https://static.apiseven.com/uploads/2023/06/13/OZebsxXL_eye-gd82fef23c.jp
 >Lots of companies are eager to provide their identity provider: Twitter, 
 >Facebook, Google, etc. For smaller businesses, not having to manage 
 >identities is a benefit. However, we want to avoid being locked into one 
 >provider. In this post, I want to demo how to use OpenID Connect using Google 
 >underneath and then switch to Azure.
 
 <!--truncate-->
-
-<head>
-    <link rel="canonical" 
href="https://blog.frankel.ch/authenticate-openid-connect/"; />
-</head>
-
 ## OpenID Connect
 
 The idea of an _authorization_ open standard started with 
[OAuth](https://en.wikipedia.org/wiki/OAuth) around 2006. Because of a security 
issue, OAuth 2.0 superseded the initial version. OAuth 2.0 became an <abbr 
title="Internet Engineering Task Force">IETF</abbr> <abbr title="Request For 
Comments">RFC</abbr> in 2012:
diff --git a/blog/en/blog/2023/03/16/grpc-client-side.md 
b/blog/en/blog/2023/03/16/grpc-client-side.md
index 725fd4d519d..1cda43323f4 100644
--- a/blog/en/blog/2023/03/16/grpc-client-side.md
+++ b/blog/en/blog/2023/03/16/grpc-client-side.md
@@ -21,11 +21,6 @@ image: 
https://static.apiseven.com/uploads/2023/06/08/DOxFlzQc_grpc.svg
 >In this post, we will briefly describe gRPC and how it benefits inter-service 
 >communication.
 
 <!--truncate-->
-
-<head>
-    <link rel="canonical" href="https://blog.frankel.ch/grpc-client-side/"; />
-</head>
-
 Most inter-systems communication components that use REST serialize their 
payload in JSON. As of now, JSON lacks a widely-used schema validation 
standard: [JSON Schema](https://json-schema.org/) is not widespread. Standard 
schema validation allows delegating the validation to a third-party library and 
being done with it. Without one, we must fall back to manual validation in the 
code. Worse, we must keep the validation code in sync with the schema.
 
 XML has schema validation out-of-the-box: an XML document can declare a 
grammar that it must conform to. SOAP, being based on XML, benefits from it too.
diff --git a/blog/en/blog/2023/03/23/mtls-everywhere.md 
b/blog/en/blog/2023/03/23/mtls-everywhere.md
index 0527c7830ea..c92b2202a3c 100644
--- a/blog/en/blog/2023/03/23/mtls-everywhere.md
+++ b/blog/en/blog/2023/03/23/mtls-everywhere.md
@@ -19,11 +19,6 @@ image: 
https://static.apiseven.com/uploads/2023/06/08/JXRmK9nZ_keys.jpeg
 >Security in one's information system has always been among the most critical 
 >Non-Functional Requirements. Transport Secure Layer, _aka_ TLS, formerly SSL, 
 >is among its many pillars. In this post, I'll show how to configure TLS for 
 >[Apache APISIX](https://apisix.apache.org/).
 
 <!--truncate-->
-
-<head>
-    <link rel="canonical" href="https://blog.frankel.ch/mtls-everywhere/"; />
-</head>
-
 ## TLS in a few words
 
 [TLS](https://wikipedia.org/wiki/Transport_Layer_Security) offers several 
capabilities:
diff --git a/blog/en/blog/2023/04/14/10-api-management-trends-2023.md 
b/blog/en/blog/2023/04/14/10-api-management-trends-2023.md
index 049cab86d4a..b1356d56bac 100644
--- a/blog/en/blog/2023/04/14/10-api-management-trends-2023.md
+++ b/blog/en/blog/2023/04/14/10-api-management-trends-2023.md
@@ -12,7 +12,6 @@ keywords:
 description: "10 major trends in API management: API security, 
standardization, cloud-based API management solutions, low-code API platforms, 
API marketplaces, emerging API protocols, AI and APIs, developer experience, 
API analytics, and serverless architecture."
 tags: [Ecosystem]
 image: 
https://static.apiseven.com/uploads/2023/04/12/PtHsoEJS_top-10-trends.png
-canonical_url: "https://api7.ai/blog/10-api-management-trends-2023";
 ---
 
 >This article introduces 10 significant trends in API management: API 
 >security, standardization, cloud-based API management solutions, low-code API 
 >platforms, API marketplaces, emerging API protocols, AI and APIs, developer 
 >experience, API analytics, and serverless architecture.
diff --git a/blog/en/blog/2023/05/04/apache-apisix-chaos-engineering.md 
b/blog/en/blog/2023/05/04/apache-apisix-chaos-engineering.md
index 040ce600d94..b5df1dad65c 100644
--- a/blog/en/blog/2023/05/04/apache-apisix-chaos-engineering.md
+++ b/blog/en/blog/2023/05/04/apache-apisix-chaos-engineering.md
@@ -12,7 +12,6 @@ keywords:
 description: Chaos engineering is a powerful tool for ensuring system 
reliability and performance, and its application in designing Chaos experiments 
for Ingress Controllers can help organizations identify weaknesses in their 
applications and infrastructure.
 tags: [Ecosystem]
 image: 
https://static.apiseven.com/uploads/2023/04/20/yeuKN9nu_Building%20a%20More%20Robust%20Apache%20APISIX%20Ingress%20Controller%20With%20Litmus%20Chaos.png
-canonical_url: "https://api7.ai/blog/apache-apisix-chaos-engineering";
 ---
 
 >Chaos engineering is a powerful tool for ensuring system reliability and 
 >performance, and its application in designing Chaos experiments for Ingress 
 >Controllers can help organizations identify weaknesses in their applications 
 >and infrastructure.
diff --git 
a/blog/en/blog/2023/05/19/why-do-microservices-need-an-api-gateway.md 
b/blog/en/blog/2023/05/19/why-do-microservices-need-an-api-gateway.md
index be2fead5ed9..6d053708ff6 100644
--- a/blog/en/blog/2023/05/19/why-do-microservices-need-an-api-gateway.md
+++ b/blog/en/blog/2023/05/19/why-do-microservices-need-an-api-gateway.md
@@ -12,7 +12,6 @@ keywords:
 description: Let's learn the importance of API gateway in the microservices 
architecture, and compare common API gateways.
 tags: [Ecosystem]
 image: 
https://static.apiseven.com/uploads/2023/02/16/CHqaC3Xw_Ecosystem%20%E6%A8%A1%E6%9D%BF1.png
-canonical_url: "https://api7.ai/blog/why-do-microservices-need-an-api-gateway";
 ---
 
 >The microservices architecture has been widely adopted by many companies. As 
 >the data and API quantity of microservices increases, it is crucial to choose 
 >an excellent API gateway for high-traffic governance: APISIX.
diff --git a/blog/en/blog/2023/06/12/how-is-apisix-fast.md 
b/blog/en/blog/2023/06/12/how-is-apisix-fast.md
index ed6b6de7028..ff5aced2709 100644
--- a/blog/en/blog/2023/06/12/how-is-apisix-fast.md
+++ b/blog/en/blog/2023/06/12/how-is-apisix-fast.md
@@ -13,7 +13,6 @@ keywords:
 description: Taking a look under Apache APISIX's hood to understand how it 
achieves ultimate performance.
 tags: [Ecosystem]
 image: 
https://static.apiseven.com/uploads/2023/06/08/3LuvBVWL_apisix-fast-cover.png
-canonical_url: "https://api7.ai/blog/how-is-apisix-fast";
 ---
 
 >In this article, we will look under the hood of APISIX and see what these are 
 >and how all of these work together to keep APISIX maintaining peak 
 >performance while handling significant traffic.
diff --git a/blog/en/blog/2023/06/30/apisix-mqtt-proxy.md 
b/blog/en/blog/2023/06/30/apisix-mqtt-proxy.md
index e86cd92d19e..96aa3642734 100644
--- a/blog/en/blog/2023/06/30/apisix-mqtt-proxy.md
+++ b/blog/en/blog/2023/06/30/apisix-mqtt-proxy.md
@@ -18,11 +18,6 @@ image: 
https://static.apiseven.com/uploads/2023/06/23/kdd9TigM_mqtt-apisix-cover
 > APISIX's support for [stream 
 > routes](https://apisix.apache.org/docs/apisix/stream-proxy/) and, in 
 > extension, the MQTT protocol is often overlooked. Let's change this by 
 > looking at an end-to-end example of how APISIX can act as an MQTT proxy.
 
 <!--truncate-->
-
-<head>
-    <link rel="canonical" href="https://navendu.me/posts/iot-to-cloud/"; />
-</head>
-
 People typically use the [MQTT protocol](https://mqtt.org/) when transferring 
data from IoT devices because of its low overhead and ease of implementation.
 
 MQTT was created for sending small chunks of data over unreliable networks and 
uses a binary format rather than the typical text-based format used in 
protocols like HTTP or SMTP. With [client 
libraries](https://mqtt.org/software/) in multiple programming languages, you 
are unlikely to have to implement the protocol on your own but use an existing 
library.
diff --git a/blog/en/blog/2023/07/07/tiny-apisix-plugin.md 
b/blog/en/blog/2023/07/07/tiny-apisix-plugin.md
index 924bddd28c5..18e1618533f 100644
--- a/blog/en/blog/2023/07/07/tiny-apisix-plugin.md
+++ b/blog/en/blog/2023/07/07/tiny-apisix-plugin.md
@@ -17,11 +17,6 @@ image: 
https://static.apiseven.com/uploads/2023/06/27/Z8CkI8kj_wasm-cover.png
 > In this article, we will write a "tiny" Go plugin for APISIX, compile it to 
 > a Wasm binary, run it in APISIX, and learn how it all works. We will also 
 > compare the benefits and costs of using Wasm plugins, external plugins 
 > (plugin runners), and native Lua plugins.
 
 <!--truncate-->
-
-<head>
-    <link rel="canonical" href="https://navendu.me/posts/tiny-apisix-plugin/"; 
/>
-</head>
-
 A key feature of Apache APISIX is its pluggable architecture. In addition to 
providing [80+ Lua plugins](https://apisix.apache.org/plugins/) out of the box, 
APISIX also supports external plugins written in other languages through 
[plugin 
runners](https://apisix.apache.org/docs/go-plugin-runner/getting-started/) and 
[WebAssembly (Wasm)](https://apisix.apache.org/docs/apisix/wasm/).
 
 In this article, we will write a "tiny" Go plugin for APISIX, compile it to a 
Wasm binary, run it in APISIX, and learn how it all works. We will also compare 
the benefits and costs of using Wasm plugins, external plugins (plugin 
runners), and native Lua plugins.
diff --git a/blog/en/blog/2023/07/09/apisix-integrates-with-vault.md 
b/blog/en/blog/2023/07/09/apisix-integrates-with-vault.md
index 1ccc832215a..78cd811c7fc 100644
--- a/blog/en/blog/2023/07/09/apisix-integrates-with-vault.md
+++ b/blog/en/blog/2023/07/09/apisix-integrates-with-vault.md
@@ -12,7 +12,6 @@ keywords:
 description: APISIX can integrate Vault to realize SSL certificate management, 
allowing for secure storage and management of SSL certificates.
 tags: [Ecosystem]
 image: 
https://static.apiseven.com/uploads/2023/06/07/isIAWmKT_How%20to%20Use%20Vault%20to%20Manage%20Certificates%20in%20APISIX.png
-canonical_url: "https://api7.ai/blog/apisix-integrates-with-vault";
 ---
 
 >This article takes configuring HTTPS communication between the downstream 
 >client and APISIX as an example to introduce how APISIX integrates Vault to 
 >implement SSL certificate management.
diff --git a/blog/en/blog/2023/07/27/apisix-without-etcd.md 
b/blog/en/blog/2023/07/27/apisix-without-etcd.md
index 9eaf6a92562..20de7103c74 100644
--- a/blog/en/blog/2023/07/27/apisix-without-etcd.md
+++ b/blog/en/blog/2023/07/27/apisix-without-etcd.md
@@ -18,11 +18,6 @@ image: 
https://static.apiseven.com/uploads/2023/07/26/T33IqLZ8_information-16419
 >While a great database, etcd is not devoid of issues. In this post, I'll show 
 >how you can use Apache APISIX with MySQL.
 
 <!--truncate-->
-
-<head>
-    <link rel="canonical" href="https://blog.frankel.ch/apisix-without-etcd/"; 
/>
-</head>
-
 [etcd](https://etcd.io/) is an excellent key-value distributed database used 
internally by Kubernetes and managed by the CNCF. It's a great option, and 
that's the reason why Apache APISIX uses it too. Yet, it's not devoid of issues.
 
 First, some mention scalability, but one can expect this from a distributed 
data store that values consistency. Another issue may be the need for more 
familiarity with etcd. It's relatively new, so your Ops team may need help 
operating it correctly while having decades of operating MySQL or Postgres. 
Finally, only a few etcd users are aware that it lacks maintainers:
diff --git a/blog/en/blog/2023/08/14/rate-limit.md 
b/blog/en/blog/2023/08/14/rate-limit.md
index 24eb657bdc0..ce2fdfc4f67 100644
--- a/blog/en/blog/2023/08/14/rate-limit.md
+++ b/blog/en/blog/2023/08/14/rate-limit.md
@@ -18,11 +18,6 @@ image: 
https://static.apiseven.com/uploads/2023/08/07/jIphRpzX_rate-limit.png
 > In this article, we will look at examples of how we can use the rate 
 > limiting plugins in APISIX.
 
 <!--truncate-->
-
-<head>
-    <link rel="canonical" href="https://navendu.me/posts/rate-limit/"; />
-</head>
-
 Setting up rate limits is a solid way to improve the reliability of your 
services.
 
 You can ensure your services are not overloaded by setting up rate limits, 
providing consistent performance for the end users. It can also help enhance 
security by preventing denial-of-service (DoS) attacks which can take down your 
services.
diff --git a/blog/en/blog/2023/08/17/ops-friendly-apisix.md 
b/blog/en/blog/2023/08/17/ops-friendly-apisix.md
index f1aea6c0e96..2bc54a8ee24 100644
--- a/blog/en/blog/2023/08/17/ops-friendly-apisix.md
+++ b/blog/en/blog/2023/08/17/ops-friendly-apisix.md
@@ -21,11 +21,6 @@ image: 
https://static.apiseven.com/2022/10/19/634f6677742a1.png
 >In this short post, I'd like to describe how to leverage Apache APISIX in 
 >containers, drawing on personal experiences with Spring Boot and WebSphere 
 >administration.
 
 <!--truncate-->
-
-<head>
-    <link rel="canonical" href="https://blog.frankel.ch/ops-friendly-apisix/"; 
/>
-</head>
-
 Though I always worked on the Dev side of IT, I was also interested in the Ops 
side. I even had a short experience being a WebSphere admin: I used it several 
times, helping Ops deal with the Admin console while being a developer.
 
 Providing a single package that Ops can configure and deploy in different 
environments is very important. As a JVM developer, I've been happy using 
Spring Boot and its wealth of configuration options: command-line parameters, 
JVM parameters, files, profiles, environment variables, etc.
diff --git a/blog/en/blog/2023/09/28/rabbit-hole-apisix-plugin.md 
b/blog/en/blog/2023/09/28/rabbit-hole-apisix-plugin.md
index 396afa83de7..d4ca7322814 100644
--- a/blog/en/blog/2023/09/28/rabbit-hole-apisix-plugin.md
+++ b/blog/en/blog/2023/09/28/rabbit-hole-apisix-plugin.md
@@ -21,11 +21,6 @@ image: 
https://static.apiseven.com/uploads/2023/09/22/7BPpDQyu_falling-5472195.j
 >My demo, Evolving your APIs, features a custom Apache APISIX plugin. I 
 >believe that the process of [creating a custom 
 >plugin](https://apisix.apache.org/docs/apisix/plugin-develop/) is relatively 
 >well-documented. However, I wanted to check the parameters of the 
 >`_M.access(conf, ctx)` function, especially the `ctx` one.
 
 <!--truncate-->
-
-<head>
-    <link rel="canonical" 
href="https://blog.frankel.ch/rabbit-hole-apisix-plugin/"; />
-</head>
-
 The documentation states:
 
 >The `ctx` parameter caches data information related to the request. You can 
 >use `core.log.warn(core.json.encode(ctx, true))` to output it to `error.log` 
 >for viewing.
diff --git a/blog/en/blog/2023/10/05/resize-images-on-the-fly.md 
b/blog/en/blog/2023/10/05/resize-images-on-the-fly.md
index ce874cbb09d..8fe43dab941 100644
--- a/blog/en/blog/2023/10/05/resize-images-on-the-fly.md
+++ b/blog/en/blog/2023/10/05/resize-images-on-the-fly.md
@@ -22,11 +22,6 @@ image: 
https://static.apiseven.com/uploads/2023/10/03/LuagzWfs_camera-514992.jpg
 >This blog xplores effective strategies for image asset management in web 
 >architecture, highlighting traditional and innovative solutions to optimize 
 >delivery and avoid reliance on CSS resizing.
 
 <!--truncate-->
-
-<head>
-    <link rel="canonical" 
href="https://blog.frankel.ch/resize-images-on-the-fly/"; />
-</head>
-
 As a web architect, one of the many issues is asset management. And the most 
significant issue in assets is images. A naive approach would be to set an 
image and let the browser resize the image via CSS:
 
 >```css
diff --git a/blog/en/blog/2023/11/09/api-versioning.md 
b/blog/en/blog/2023/11/09/api-versioning.md
index 91521a1fea6..148f74d20f4 100644
--- a/blog/en/blog/2023/11/09/api-versioning.md
+++ b/blog/en/blog/2023/11/09/api-versioning.md
@@ -22,11 +22,6 @@ image: 
https://static.apiseven.com/uploads/2023/11/06/PjxXv0E9_signpost-3691159.
 >In my previous post [Evolving your 
 >APIs](https://blog.frankel.ch/evolve-apis/), I mention the main API 
 >versioning approaches. During the talk of the same name, I sometimes get some 
 >questions on the subject. In this post, I'll detail each of them.
 
 <!--truncate-->
-
-<head>
-    <link rel="canonical" href="https://blog.frankel.ch/api-versioning/"; />
-</head>
-
 I assume readers know the reasons behind versioning, semantic versioning, and 
product lifecycle. If not, I encourage you to read a bit about these themes; in 
particular, chapter 24 of the excellent [API Design 
Patterns](https://blog.frankel.ch/api-design-patterns/) book focuses on them.
 
 I'll summarize the subject in a few words in any case.
diff --git a/blog/en/blog/2023/11/30/chopping-monolith-smarter-way.md 
b/blog/en/blog/2023/11/30/chopping-monolith-smarter-way.md
index fcf4d970ae7..dcee2cdf7d9 100644
--- a/blog/en/blog/2023/11/30/chopping-monolith-smarter-way.md
+++ b/blog/en/blog/2023/11/30/chopping-monolith-smarter-way.md
@@ -22,11 +22,6 @@ image: 
https://static.apiseven.com/uploads/2023/11/29/LfrGvISN_roger_stone.jpg
 >In my previous post [Chopping the 
 >Monolith](https://blog.frankel.ch/chopping-monolith-smarter-way/), I 
 >explained that some parts of a monolith are pretty stable and only the 
 >fast-changing parts are worth being "chopped." I turned the post into a talk 
 >and presented it at several conferences. I think it's pretty well received; I 
 >believe it's because most developers understand, or have direct experience, 
 >that microservices are not a good fit for traditional organizations, as per 
 >[Conway's  [...]
 
 <!--truncate-->
-
-<head>
-    <link rel="canonical" 
href="https://blog.frankel.ch/chopping-monolith-smarter-way/"; />
-</head>
-
 In the talk, I use an e-commerce webapp as an example.
 
 ![Regular requests 
flow](https://static.apiseven.com/uploads/2023/11/29/Cjqme0MX_original-flow.svg)
diff --git a/blog/en/blog/2023/12/07/canary-releases-apisix.md 
b/blog/en/blog/2023/12/07/canary-releases-apisix.md
index 5ea153dba77..385e1d6250a 100644
--- a/blog/en/blog/2023/12/07/canary-releases-apisix.md
+++ b/blog/en/blog/2023/12/07/canary-releases-apisix.md
@@ -21,11 +21,6 @@ image: 
https://static.apiseven.com/uploads/2023/12/05/OH9weScF_bird-5285011.jpg
 >In this post, I'd like to detail this introduction briefly, explain different 
 >ways to define the fraction, and show how to execute it with Apache APISIX.
 
 <!--truncate-->
-
-<head>
-    <link rel="canonical" 
href="https://blog.frankel.ch/canary-releases-apisix/"; />
-</head>
-
 ## Introduction to canary releases
 
 The term "canary" originates from the coal mining industry. When mining, it's 
not uncommon to release toxic gases: In a small enclosed space, it can mean 
quick death. Worse, the gas may be odorless, so miners would breathe it until 
it was too late to leave. Carbon monoxide is quite common in coal mines and is 
not detectable by human senses.
diff --git 
a/blog/en/blog/2023/12/14/apisix-plugins-priority-leaky-abstraction.md 
b/blog/en/blog/2023/12/14/apisix-plugins-priority-leaky-abstraction.md
index f3df980d84a..53e647370a6 100644
--- a/blog/en/blog/2023/12/14/apisix-plugins-priority-leaky-abstraction.md
+++ b/blog/en/blog/2023/12/14/apisix-plugins-priority-leaky-abstraction.md
@@ -22,11 +22,6 @@ image: 
https://static.apiseven.com/uploads/2023/12/09/acT4tzVw_puzzle-3486885.jp
 >In this post, I'd like to describe how plugins, priority, and phases play 
 >together and what pitfalls you must be aware of.
 
 <!--truncate-->
-
-<head>
-    <link rel="canonical" 
href="https://blog.frankel.ch/apisix-plugins-priority-leaky-abstraction/"; />
-</head>
-
 ## APISIX plugin's priority
 
 When you configure a route with multiple plugins, Apache APISIX needs to 
execute them in a **consistent** order so that the results are the same over 
time. For this reason, every APISIX plugin has a _harcoded_ **priority**. You 
can check a plugin priority directly in the code. For example, here's the 
relevant code fragment for the `basic-auth` plugin:
diff --git a/blog/en/blog/2024/02/13/apisix-owasp-coraza-core-ruleset.md 
b/blog/en/blog/2024/02/13/apisix-owasp-coraza-core-ruleset.md
index 8f51d77f715..64240ffa6af 100644
--- a/blog/en/blog/2024/02/13/apisix-owasp-coraza-core-ruleset.md
+++ b/blog/en/blog/2024/02/13/apisix-owasp-coraza-core-ruleset.md
@@ -16,11 +16,6 @@ description: >
 tags: [Ecosystem]
 image: 
https://static.apiseven.com/uploads/2024/02/10/vVlFQu7C_img-HDlf4Xx9m1iqS0Ico3oBZ.png
 ---
-
-<head>
-    <link rel="canonical" 
href="https://blog.frankel.ch/apisix-owasp-coraza-core-ruleset/"; />
-</head>
-
 >In this post, I'd like to describe how to fix some of them via the [Apache 
 >APISIX API Gateway](https://apisix.apache.org/).
 
 <!--truncate-->
diff --git a/blog/en/blog/2024/02/20/secure-api-practices-apisix-1.md 
b/blog/en/blog/2024/02/20/secure-api-practices-apisix-1.md
index 90e879ebe34..c5bc80eca6b 100644
--- a/blog/en/blog/2024/02/20/secure-api-practices-apisix-1.md
+++ b/blog/en/blog/2024/02/20/secure-api-practices-apisix-1.md
@@ -18,11 +18,6 @@ description: >
 tags: [Ecosystem]
 image: 
https://static.apiseven.com/uploads/2024/02/15/kgIjhRXf_img-BuLDzx81CexYQAzkaF36h_large.webp
 ---
-
-<head>
-    <link rel="canonical" 
href="https://blog.frankel.ch/secure-api-practices-apisix/1/"; />
-</head>
-
 >A couple of months ago, I stumbled upon this list of  Secure your API with 
 >these [16 practices to secure your 
 >API](https://www.linkedin.com/posts/brijpandeyji_secure-your-api-with-these-16-practices-activity-7094020647529369601-5kzQ/):
 >
 >While it's debatable whether some points relate to security, _e.g.,_, 
 >versioning, the list is a good starting point anyway. In this two-post 
 >series, I'd like to describe how we can implement each point with Apache 
 >APISXI (or not).
diff --git a/blog/en/blog/2024/02/27/secure-api-practices-apisix-2.md 
b/blog/en/blog/2024/02/27/secure-api-practices-apisix-2.md
index d021330de12..6917424eb10 100644
--- a/blog/en/blog/2024/02/27/secure-api-practices-apisix-2.md
+++ b/blog/en/blog/2024/02/27/secure-api-practices-apisix-2.md
@@ -18,11 +18,6 @@ description: >
 tags: [Ecosystem]
 image: 
https://static.apiseven.com/uploads/2024/02/15/kgIjhRXf_img-BuLDzx81CexYQAzkaF36h_large.webp
 ---
-
-<head>
-    <link rel="canonical" 
href="https://blog.frankel.ch/secure-api-practices-apisix/2/"; />
-</head>
-
 >[Last week](https://blog.frankel.ch/secure-api-practices-apisix/1/), we 
 >listed 16 practices to help secure one's APIs and described how to implement 
 >them with Apache APISIX. This week, we will look at the remaining practices.
 
 <!--truncate-->
diff --git a/blog/en/blog/2024/03/28/apisix-north-america-tour.md 
b/blog/en/blog/2024/03/28/apisix-north-america-tour.md
index 20bd4363947..c0b6c2f5e40 100644
--- a/blog/en/blog/2024/03/28/apisix-north-america-tour.md
+++ b/blog/en/blog/2024/03/28/apisix-north-america-tour.md
@@ -14,11 +14,6 @@ description: >
 tags: [Community]
 image: 
https://static.apiseven.com/uploads/2024/03/26/qIgl44le_globe-1311758_1280.jpg
 ---
-
-<head>
-    <link rel="canonical" 
href="https://blog.frankel.ch/apisix-north-america-tour/"; />
-</head>
-
 >Once in a while, I write non-technical blog posts when I've something worth 
 >sharing. Today, I'd like to write about my North America "Tour" across 
 >several conferences and user groups.
 
 <!--truncate-->
diff --git a/blog/en/blog/2024/04/04/fix-duplicate-api-requests.md 
b/blog/en/blog/2024/04/04/fix-duplicate-api-requests.md
index 586160d39b1..055b75f7b2e 100644
--- a/blog/en/blog/2024/04/04/fix-duplicate-api-requests.md
+++ b/blog/en/blog/2024/04/04/fix-duplicate-api-requests.md
@@ -15,11 +15,6 @@ description: >
 tags: [Community]
 image: 
https://static.apiseven.com/uploads/2024/03/28/XObjRS46_stormtrooper-2899993.jpg
 ---
-
-<head>
-    <link rel="canonical" 
href="https://blog.frankel.ch/fix-duplicate-api-requests/"; />
-</head>
-
 >The first rule of distributed systems is "Don’t distribute your system". 
 >Designing distributed systems right is infamously hard for multiple reasons.
 
 <!--truncate-->
diff --git a/blog/en/blog/2024/04/11/implement-idempotency-key-apisix.md 
b/blog/en/blog/2024/04/11/implement-idempotency-key-apisix.md
index 0533e744982..5684f863aa6 100644
--- a/blog/en/blog/2024/04/11/implement-idempotency-key-apisix.md
+++ b/blog/en/blog/2024/04/11/implement-idempotency-key-apisix.md
@@ -20,11 +20,6 @@ description: >
 tags: [Plugin]
 image: 
https://static.apiseven.com/uploads/2024/04/09/0rfsRevo_stormtrooper-2899993.jpg
 ---
-
-<head>
-    <link rel="canonical" 
href="https://blog.frankel.ch/implement-idempotency-key-apisix/"; />
-</head>
-
 >Last week, I wrote an 
 >[analysis](https://apisix.apache.org/blog/2024/04/04/fix-duplicate-api-requests/)
 > of the [IETF Idempotency-Key 
 >specification](https://datatracker.ietf.org/doc/html/draft-ietf-httpapi-idempotency-key-header-04).
 > The specification aims to avoid duplicated requests. In short, the idea is 
 >for the client to send a unique key along with the request:
 >
 >* If the server doesn't know the key, it proceeds as usual and then stores 
 >the response
diff --git a/blog/en/blog/2024/05/02/pass-parameters-apisix.md 
b/blog/en/blog/2024/05/02/pass-parameters-apisix.md
index 52f8240e220..16178aaa773 100644
--- a/blog/en/blog/2024/05/02/pass-parameters-apisix.md
+++ b/blog/en/blog/2024/05/02/pass-parameters-apisix.md
@@ -14,11 +14,6 @@ description: >
 tags: [Ecosystem]
 image: 
https://static.apiseven.com/uploads/2024/04/25/V05nSV5W_american-football-63109.jpg
 ---
-
-<head>
-    <link rel="canonical" 
href="https://blog.frankel.ch/pass-parameters-apisix/"; />
-</head>
-
 >I recently read [6 Ways To Pass Parameters to Spring REST 
 >API](https://javabulletin.substack.com/p/6-ways-to-pass-parameters-to-spring).
 > Though the title is a bit misleading, as it's unrelated to REST, it does an 
 >excellent job listing all ways to send parameters to a Spring application. I 
 >want to do the same for Apache APISIX; it's beneficial when you write a 
 >custom plugin.
 
 <!--truncate-->
diff --git a/blog/en/blog/2024/06/06/even-more-opentelemetry.md 
b/blog/en/blog/2024/06/06/even-more-opentelemetry.md
index dc99b18b61b..8dec571141e 100644
--- a/blog/en/blog/2024/06/06/even-more-opentelemetry.md
+++ b/blog/en/blog/2024/06/06/even-more-opentelemetry.md
@@ -17,11 +17,6 @@ description: >
 tags: [Ecosystem]
 image: 
https://static.apiseven.com/uploads/2024/05/29/RkjCnHCV_sun-rays-7387131.jpg
 ---
-
-<head>
-    <link rel="canonical" 
href="https://blog.frankel.ch/even-more-opentelemetry/"; />
-</head>
-
 >I continue to work on my [Opentelemetry 
 >demo](https://github.com/nfrankel/opentelemetry-tracing). Its main idea is to 
 >showcase _traces_ across various technology stacks, including asynchronous 
 >communication via an MQTT queue. This week, I added a couple of components 
 >and changed the architecture. Here are some noteworthy learnings; note that 
 >some of them might not be entirely connected to OpenTelemetry.
 
 <!--truncate-->
diff --git a/blog/en/blog/2024/06/13/fixed-routes-apisix.md 
b/blog/en/blog/2024/06/13/fixed-routes-apisix.md
index ecef4cc8eae..9cd31e13adb 100644
--- a/blog/en/blog/2024/06/13/fixed-routes-apisix.md
+++ b/blog/en/blog/2024/06/13/fixed-routes-apisix.md
@@ -14,11 +14,6 @@ description: >
 tags: [Ecosystem]
 image: 
https://static.apiseven.com/uploads/2024/06/12/2XTLbwyU_tower-1897536.jpg
 ---
-
-<head>
-    <link rel="canonical" href="https://blog.frankel.ch/fixed-routes-apisix/"; 
/>
-</head>
-
 >My ideas for blog posts inevitably start to dry up after over two years at 
 >[Apache APISIX](https://apisix.apache.org/). Hence, I did some triage on the 
 >[APISIX repo](https://github.com/apache/apisix/issues). I stumbled upon this 
 >one question:
 
 <!--truncate-->
diff --git a/blog/en/blog/2024/07/11/watermarking-infrastructure.md 
b/blog/en/blog/2024/07/11/watermarking-infrastructure.md
index 3526b153f80..e8ada7c0564 100644
--- a/blog/en/blog/2024/07/11/watermarking-infrastructure.md
+++ b/blog/en/blog/2024/07/11/watermarking-infrastructure.md
@@ -16,11 +16,6 @@ description: >
 tags: [Ecosystem]
 image: 
https://static.apiseven.com/uploads/2024/07/04/j2xS06dA_faucet-1684902.jpg
 ---
-
-<head>
-    <link rel="canonical" 
href="https://blog.frankel.ch/dynamic-watermarking/2/"; />
-</head>
-
 >Last week, I described [how to add a dynamic watermark to your images on the 
 >JVM](https://blog.frankel.ch/dynamic-watermarking/1/). I didn't find any 
 >library, so I had to develop the feature, or, more precisely, an embryo of a 
 >feature, by myself. Depending on your tech stack, you must search for an 
 >existing library or roll up your sleeves. For example, Rust offers such an 
 >out-of-the-box library. Worse, this approach might be impossible to implement 
 >if you don't have access to the source image.
 >
 >Another alternative is to use ready-made components, namely 
 >[imgproxy](https://imgproxy.net/) and [Apache 
 >APISIX](https://apisix.apache.org/). I already combined them to [resize 
 >images on-the-fly](https://blog.frankel.ch/resize-images-on-the-fly/).
diff --git a/blog/en/blog/2024/07/18/advanced-url-rewrite-apisix.md 
b/blog/en/blog/2024/07/18/advanced-url-rewrite-apisix.md
index 187071137fa..7753c7fa2e1 100644
--- a/blog/en/blog/2024/07/18/advanced-url-rewrite-apisix.md
+++ b/blog/en/blog/2024/07/18/advanced-url-rewrite-apisix.md
@@ -15,11 +15,6 @@ description: >
 tags: [Ecosystem]
 image: 
https://static.apiseven.com/uploads/2024/07/11/zFguMrgf_notebook-1840276.jpg
 ---
-
-<head>
-    <link rel="canonical" 
href="https://blog.frankel.ch/advanced-url-rewrite-apisix/"; />
-</head>
-
 >I spoke at [Swiss PgDay](https://www.pgday.ch/2024/#schedule) in Switzerland 
 >in late June. The talk was about how to create a no-code API with the famous 
 >[PostgreSQL](https://www.postgresql.org/) database, the related 
 >[PostgREST](https://postgrest.org/), and [Apache 
 >APISIX](https://apisix.apache.org), of course. I already wrote about the idea 
 >in a [previous post](https://blog.frankel.ch/poor-man-api/). However, I 
 >wanted to improve it, if only slightly.
 >
 >PostgREST offers a powerful `SELECT` mechanism. To list all entities with a 
 >column equal to a value, you need the following command:
diff --git a/blog/en/blog/2024/07/25/different-rate-limits-apisix.md 
b/blog/en/blog/2024/07/25/different-rate-limits-apisix.md
index 436c4a5a988..2c27fda6d54 100644
--- a/blog/en/blog/2024/07/25/different-rate-limits-apisix.md
+++ b/blog/en/blog/2024/07/25/different-rate-limits-apisix.md
@@ -15,11 +15,6 @@ description: >
 tags: [Ecosystem]
 image: 
https://static.apiseven.com/uploads/2024/07/27/U4BZicm8_speedometer-1249610.jpg
 ---
-
-<head>
-    <link rel="canonical" 
href="https://blog.frankel.ch/different-rate-limits-apisix/"; />
-</head>
-
 >In my talk Evolving your APIs, I mention that an API Gateway is a Reverse 
 >Proxy "on steroids". One key difference between the former and the latter is 
 >that the API Gateway is not unfriendly to business logic. The poster child is 
 >rate-limiting.
 
 <!--truncate-->
diff --git a/blog/en/blog/2024/08/01/free-tier-api-apisix.md 
b/blog/en/blog/2024/08/01/free-tier-api-apisix.md
index 616686bdc2f..d6dc3995daa 100644
--- a/blog/en/blog/2024/08/01/free-tier-api-apisix.md
+++ b/blog/en/blog/2024/08/01/free-tier-api-apisix.md
@@ -15,11 +15,6 @@ description: >
 tags: [Ecosystem]
 image: https://static.apiseven.com/uploads/2024/08/03/9WL5vdEC_beer-2439237.jpg
 ---
-
-<head>
-    <link rel="canonical" href="https://blog.frankel.ch/free-tier-api-apisix/"; 
/>
-</head>
-
 >Lots of service providers offer a free tier of their service. The idea is to 
 >let you kick their service's tires freely. If you need to go above the free 
 >tier at any point, you'll likely stay on the service and pay. In this day and 
 >age, most services are online and accessible via an API. Today, we will 
 >implement a free tier with [Apache APISIX](https://apisix.apache.org/).
 
 <!--truncate-->
diff --git a/blog/en/blog/2024/10/22/apisix-integrates-with-open-appsec.md 
b/blog/en/blog/2024/10/22/apisix-integrates-with-open-appsec.md
index e54a508db6e..3c3fcb970af 100644
--- a/blog/en/blog/2024/10/22/apisix-integrates-with-open-appsec.md
+++ b/blog/en/blog/2024/10/22/apisix-integrates-with-open-appsec.md
@@ -25,11 +25,6 @@ image: 
https://static.apiseven.com/uploads/2024/10/18/8d1iVJWL_logo%20x%20open-a
 > We are excited to announce a new integration between Apache APISIX and 
 > open-appsec WAF, combining the power of a dynamic API gateway with 
 > cutting-edge application security.
 
 <!--truncate-->
-
-<head>
-    <link rel="canonical" 
href="https://www.openappsec.io/post/announcing-open-appsec-WAF-integration-with-Apache-APISIX-API-Gateway";
 />
-</head>
-
 ## Introduction
 
 open-appsec WAF is excited to announce a new integration with the open-source 
API gateway Apache APISIX.
diff --git a/blog/en/blog/2025/02/06/analyzing-api-gateway-adoption-rates.md 
b/blog/en/blog/2025/02/06/analyzing-api-gateway-adoption-rates.md
index da926a0aa2b..5bab6b9d553 100644
--- a/blog/en/blog/2025/02/06/analyzing-api-gateway-adoption-rates.md
+++ b/blog/en/blog/2025/02/06/analyzing-api-gateway-adoption-rates.md
@@ -17,11 +17,6 @@ description: Explore 2025 API gateway adoption trends with 
data-driven insights
 tags: [Ecosystem]
 image: 
https://static.apiseven.com/uploads/2025/02/06/qX7Uwq66_1738762325395.png
 ---
-
-<head>
-    <link rel="canonical" 
href="https://www.linkedin.com/pulse/analyzing-api-gateway-adoption-rates-through-internet-ming-wen-prync/?trackingId=e7XGKblnQF%2BVlG5FDouG%2Fg%3D%3D";
 />
-</head>
-
 > [Ming Wen](https://www.linkedin.com/in/ming-wen-api7/), Chairman of Apache 
 > APISIX, recently posted a blog about [data-driven analysis of API gateway 
 > adoption](https://www.linkedin.com/posts/ming-wen-api7_apigateway-kong-apisix-activity-7292899936659021824-7KrU/?utm_source=share&utm_medium=member_desktop)
 >  on LinkedIn. The analysis uses two methods: internet-wide scans (FOFA) to 
 > identify publicly exposed API gateway instances and company adoption data 
 > (BuiltWith) to reveal which business [...]
 <!--truncate-->
 
diff --git a/blog/en/blog/2025/02/21/why-reinvent-api-gateways.md 
b/blog/en/blog/2025/02/21/why-reinvent-api-gateways.md
index 890f7b03e2f..93f837827c7 100644
--- a/blog/en/blog/2025/02/21/why-reinvent-api-gateways.md
+++ b/blog/en/blog/2025/02/21/why-reinvent-api-gateways.md
@@ -17,11 +17,6 @@ description: Discover the journey of Apache APISIX, from a 
small windowless offi
 tags: [Community]
 image: 
https://static.api7.ai/uploads/2025/03/07/uwv68gCg_story-behind-apache-pisix.webp
 ---
-
-<head>
-  <link rel="canonical" 
href="https://www.linkedin.com/pulse/why-we-reinventing-api-gateways-story-behind-apache-apisix-ming-wen-h3yqc/";
 />
-</head>
-
 >Apache APISIX has quickly become a leading API gateway, with over 460 
 >contributors and 15K+ GitHub stars. This article explores its journey from a 
 >small project to a widely-used, open-source solution, addressing key 
 >challenges in modern API management.
 
 <!--truncate-->
diff --git a/blog/zh/blog/2021/11/17/dapr-with-apisix.md 
b/blog/zh/blog/2021/11/17/dapr-with-apisix.md
index a8f7f62b533..f5b0a466471 100644
--- a/blog/zh/blog/2021/11/17/dapr-with-apisix.md
+++ b/blog/zh/blog/2021/11/17/dapr-with-apisix.md
@@ -17,11 +17,6 @@ image: 
https://static.apiseven.com/2022/blog/0818/ecosystem/dapr.png
 > 本文将为大家展示如何通过集成 Dapr 创建一个 Apache APISIX 控制器。包括项目概念以及具体操作步骤。
 
 <!--truncate-->
-
-<head>
-    <link rel="canonical" 
href="https://blog.dapr.io/posts/2022/01/13/enable-dapr-with-apache-apisix-ingress-controller/";
 />
-</head>
-
 本质上,Apache APISIX 控制器将配置相同标准 Dapr annotations 以注入 daprd sidecar。通过公开这个 
sidecar,将允许外部应用程序与集群中启用 Dapr 的应用程序进行通信。
 
 下图为实际项目中的架构流程:
diff --git a/blog/zh/blog/2021/12/10/integrate-keycloak-auth-in-apisix.md 
b/blog/zh/blog/2021/12/10/integrate-keycloak-auth-in-apisix.md
index b5874cdc9ad..f2ba33c5749 100644
--- a/blog/zh/blog/2021/12/10/integrate-keycloak-auth-in-apisix.md
+++ b/blog/zh/blog/2021/12/10/integrate-keycloak-auth-in-apisix.md
@@ -23,11 +23,6 @@ image: 
https://static.apiseven.com/2022/blog/0818/plugins/keycloak.png
 > 本文通过详细的步骤为大家展示了如何在 Apache APISIX 使用 OpenID-Connect 协议和 Keycloak 进行身份认证。通过对接 
 > Keycloak,Apache APISIX 仅需通过配置即可实现对使用者和应用服务进行认证与鉴权,从而大大减少了相关开发工作。
 
 <!--truncate-->
-
-<head>
-    <link rel="canonical" href="https://www.keycloak.org/2021/12/apisix"; />
-</head>
-
 ![Keycloak-APISIX 
集成](https://static.apiseven.com/202108/1639129658486-393e8a3a-ccf2-496d-9b46-4db741bd6e55.png)
 
 ## 什么是 Keycloak
diff --git a/blog/zh/blog/2022/02/28/apisix-integration-opentelemetry-plugin.md 
b/blog/zh/blog/2022/02/28/apisix-integration-opentelemetry-plugin.md
index a3249e33152..d623d611859 100644
--- a/blog/zh/blog/2022/02/28/apisix-integration-opentelemetry-plugin.md
+++ b/blog/zh/blog/2022/02/28/apisix-integration-opentelemetry-plugin.md
@@ -23,11 +23,6 @@ image: 
https://static.apiseven.com/2022/blog/0818/plugins/opentelemetry.png
 > 本文为您介绍了 API 网关 Apache APISIX 中的 `opentelemetry` 插件的概念以及如何部署 `opentelemetry` 
 > 插件。
 
 <!--truncate-->
-
-<head>
-    <link rel="canonical" href="https://opentelemetry.io/blog/2022/apisix/"; />
-</head>
-
 ## 背景信息
 
 Apache APISIX 是一个动态、实时、高性能的 API 
网关,提供负载均衡、动态上游、灰度发布、服务熔断、身份认证、可观测性等丰富的流量管理功能。作为 API 网关,Apache APISIX 
不仅拥有众多实用的插件,而且支持插件动态变更和热插拔。
diff --git a/blog/zh/blog/2022/09/27/why-apache-apisix-is-best-apigateway.md 
b/blog/zh/blog/2022/09/27/why-apache-apisix-is-best-apigateway.md
index 8785ef314ef..2b4e95cf863 100644
--- a/blog/zh/blog/2022/09/27/why-apache-apisix-is-best-apigateway.md
+++ b/blog/zh/blog/2022/09/27/why-apache-apisix-is-best-apigateway.md
@@ -18,11 +18,6 @@ image: 
https://static.apiseven.com/2022/10/19/634f6677742a1.png
 > 本文首发于 
 > [API7.ai](https://www.apiseven.com/blog/why-is-apache-apisix-the-best-api-gateway),从多个角度(在开发人员中的受欢迎程度、开源许可证、性能和整个生态系统)对比多个
 >  API 网关(Kong、Tyk、Gloo)。
 
 <!--truncate-->
-
-<head>
-  <link rel="canonical" 
href="https://www.apiseven.com/blog/why-is-apache-apisix-the-best-api-gateway"; 
/>
-</head>
-
 今天,我们可以通过手机和各种 APP 完成各种各样的事情,比如社交,网购等。这些行为的背后,API 起到了关键的作用。作为 API 的使用者,我们并不关心 
API 的稳定、安全和高效,但是通过 API 提供数据服务的企业则需要选择一个合适的 API 网关,用来保证数千乃至数万的 API 为提供快速和安全的服务。
 
 在 CNCF 的 [API Gateway 
landscape](https://landscape.cncf.io/card-mode?category=api-gateway&grouping=category&sort=contributors)
 中有接近 20 个 API 网关的选型(不包括公有云厂商的产品),包括 Apache APISIX、Kong、Tyk 等等。

Reply via email to