You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by dj...@apache.org on 2021/11/16 21:41:14 UTC

[camel-website] 01/02: Assemble the final .htaccess file from a static file, the Antora generated .htaccess file, and transformations of generated 302 rules

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

djencks pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-website.git

commit 809e1db85f4461f6e02e3ffee7262bc6285406e9
Author: David Jencks <dj...@apache.org>
AuthorDate: Sat Nov 13 18:29:22 2021 -0800

    Assemble the final .htaccess file from a static file, the Antora generated .htaccess file, and transformations of generated 302 rules
---
 antora-playbook.yml      |   8 +-
 gulpfile.js              |  39 +++++++++
 local-httpd-in-docker.sh |   9 ++
 package.json             |   4 +-
 static/.htaccess         | 208 +----------------------------------------------
 tests/redirect.sh        |  97 +++++++++++++---------
 6 files changed, 115 insertions(+), 250 deletions(-)

diff --git a/antora-playbook.yml b/antora-playbook.yml
index 41b475b..786b589 100644
--- a/antora-playbook.yml
+++ b/antora-playbook.yml
@@ -1,7 +1,7 @@
 site:
   title: Apache Camel
   url: https://camel.apache.org
-  start_page: _@manual::index.adoc
+#  start_page: _@manual::index.adoc
 
 content:
   sources:
@@ -97,9 +97,9 @@ ui:
     url: ./antora-ui-camel/build/ui-bundle.zip
 
 urls:
-  redirect_facility: disabled
-#  latest_version_segment_strategy: redirect:from
-#  latest_version_segment: latest
+  redirect_facility: httpd
+  latest_version_segment_strategy: redirect:from
+  latest_version_segment: latest
 
 
 output:
diff --git a/gulpfile.js b/gulpfile.js
index 97712f2..881724e 100644
--- a/gulpfile.js
+++ b/gulpfile.js
@@ -2,6 +2,7 @@ const cheerio = require('gulp-cheerio');
 const env = process.env.CAMEL_ENV || 'development';
 const gulp = require('gulp');
 const htmlmin = require('gulp-htmlmin');
+const inject = require('gulp-inject')
 
 /**
  * We minify all HTML files using htmlmin, this is to make them smaller in size
@@ -53,6 +54,44 @@ gulp.task('sitemap', (done) => {
     .pipe(gulp.dest('public'));
 });
 
+gulp.task('htaccess', (done) => {
+  return gulp.src(`static/.htaccess`)
+    .pipe(
+      inject(
+        gulp.src('documentation/.htaccess'),
+        {
+          starttag:'<!-- inject:htaccess -->',
+          removeTags: true,
+          transform: (filename, file) => {
+            return versionlessRedirects(file.contents.toString('utf8'))
+          },
+        }
+      )
+    )
+    .pipe(gulp.dest('public'))
+});
+
+const REDIRECT_RX = /^Redirect 302 \/(?<component>c.*)\/latest \/\k<component>\/(?<version>.*)$/
+
+function versionlessRedirects (text) {
+  const lines = text.split('\n')
+  const processed = lines.reduce((accum, line) => {
+    accum.push(line)
+    const m = line.match(REDIRECT_RX)
+    if (m) {
+      accum.push(`RedirectMatch 302 "^/${m.groups.component}(/?)$" "/${m.groups.component}/${m.groups.version}/"`)
+      // The first line redirects **/next to **/next/ so the second line does not match.
+      // Apparently it needs to be a match or it will transform **/next/ to **/next//
+      accum.push(`RedirectMatch 301 "^/${m.groups.component}/next$" "/${m.groups.component}/next/"`)
+      accum.push(`RedirectMatch 302 "^/${m.groups.component}/(?![0-9].*|next/)(.+)$" "/${m.groups.component}/${m.groups.version}/$1"`)
+      // As an alternative, the following line works as long as no file names start with 'next'
+      // accum.push(`RedirectMatch 302 "^/${m.groups.component}/(?![0-9].*|next)(.+)$" "/${m.groups.component}/${m.groups.version}/$1"`)
+    }
+    return accum
+  }, [])
+  return processed.join('\n')
+}
+
 /*
  * Removes the content from the `public` directory.
  */
diff --git a/local-httpd-in-docker.sh b/local-httpd-in-docker.sh
new file mode 100755
index 0000000..596ada5
--- /dev/null
+++ b/local-httpd-in-docker.sh
@@ -0,0 +1,9 @@
+#!/bin/sh
+
+# Run httpd in docker
+
+#docker build -t camel-website .
+docker run --rm -p 80:80 -p 443:443 \
+  -v "$PWD/public":/usr/local/apache2/htdocs/:Z \
+  -v "$PWD/support/http":/support:Z \
+  httpd:2.4 /bin/bash -c "cp /support/* /usr/local/apache2/conf/ && httpd-foreground"
\ No newline at end of file
diff --git a/package.json b/package.json
index 8229bf7..9d4cfbd 100644
--- a/package.json
+++ b/package.json
@@ -3,12 +3,13 @@
   "version": "1.0.0-SNAPSHOT",
   "license": "Apache-2.0",
   "scripts": {
-    "build": "run-s build:antora build:hugo build:sitemap build:minify",
+    "build": "run-s build:antora build:hugo build:sitemap build:htaccess build:minify",
     "build-all": "yarn workspaces foreach --topological-dev run build",
     "build:antora": "antora --clean --fetch antora-playbook.yml --stacktrace",
     "build:hugo": "hugo --cacheDir ${HUGO_CACHE_DIR:-$(pwd)/.hugo_data} ${HUGO_OPTIONS:-}",
     "build:minify": "gulp minify",
     "build:sitemap": "gulp sitemap",
+    "build:htaccess": "gulp htaccess",
     "check:html": "html-validate public",
     "check:links": "deadlinks-linux public",
     "checks": "run-s check:links check:html",
@@ -38,6 +39,7 @@
     "gulp": "~4.0",
     "gulp-cheerio": "~1.0",
     "gulp-htmlmin": "~5.0",
+    "gulp-inject": "^5.0.2",
     "html-validate": "~4",
     "hugo-extended": "^0.84.3",
     "netlify-cli": "^6.14.10",
diff --git a/static/.htaccess b/static/.htaccess
index 2165b7d..dd65921 100644
--- a/static/.htaccess
+++ b/static/.htaccess
@@ -548,187 +548,6 @@ Redirect 301 /camel-embedded-maven-goal.html /manual/camel-embedded-maven-goal.h
 Redirect 301 /camel-jar-dependencies.html /manual/camel-jar-dependencies.html
 Redirect 301 /camel-maven-archetypes.html /manual/camel-maven-archetypes.html
 Redirect 301 /camel-maven-plugin.html /manual/camel-maven-plugin.html
-# camel-quarkus start: copied from camel-quarkus/docs/target/site/.htaccess built locally
-Redirect 301 /camel-quarkus/latest/list-of-camel-quarkus-extensions.html /camel-quarkus/next/reference/index.html
-Redirect 301 /camel-quarkus/latest/reference/extensions/index.html /camel-quarkus/next/reference/index.html
-Redirect 301 /camel-quarkus/latest/cdi.html /camel-quarkus/next/user-guide/cdi.html
-Redirect 301 /camel-quarkus/latest/examples.html /camel-quarkus/next/user-guide/examples.html
-Redirect 301 /camel-quarkus/latest/first-steps.html /camel-quarkus/next/user-guide/first-steps.html
-Redirect 301 /camel-quarkus/latest/user-guide.html /camel-quarkus/next/user-guide/index.html
-Redirect 301 /camel-quarkus/latest/native-mode.html /camel-quarkus/next/user-guide/native-mode.html
-Redirect 301 /camel-quarkus/latest/ci.html /camel-quarkus/next/contributor-guide/ci.html
-Redirect 301 /camel-quarkus/latest/create-new-extension.html /camel-quarkus/next/contributor-guide/create-new-extension.html
-Redirect 301 /camel-quarkus/latest/extension-documentation.html /camel-quarkus/next/contributor-guide/extension-documentation.html
-Redirect 301 /camel-quarkus/latest/extension-metadata.html /camel-quarkus/next/contributor-guide/extension-metadata.html
-Redirect 301 /camel-quarkus/latest/contributor-guide.html /camel-quarkus/next/contributor-guide/index.html
-Redirect 301 /camel-quarkus/latest/promote-jvm-to-native.html /camel-quarkus/next/contributor-guide/promote-jvm-to-native.html
-Redirect 301 /camel-quarkus/latest/release-guide.html /camel-quarkus/next/contributor-guide/release-guide.html
-Redirect 301 /camel-quarkus/latest/extensions/activemq.html /camel-quarkus/next/reference/extensions/activemq.html
-Redirect 301 /camel-quarkus/latest/extensions/ahc-ws.html /camel-quarkus/next/reference/extensions/ahc-ws.html
-Redirect 301 /camel-quarkus/latest/extensions/ahc.html /camel-quarkus/next/reference/extensions/ahc.html
-Redirect 301 /camel-quarkus/latest/extensions/amqp.html /camel-quarkus/next/reference/extensions/amqp.html
-Redirect 301 /camel-quarkus/latest/extensions/attachments.html /camel-quarkus/next/reference/extensions/attachments.html
-Redirect 301 /camel-quarkus/latest/extensions/avro-rpc.html /camel-quarkus/next/reference/extensions/avro-rpc.html
-Redirect 301 /camel-quarkus/latest/extensions/avro.html /camel-quarkus/next/reference/extensions/avro.html
-Redirect 301 /camel-quarkus/latest/extensions/aws-ec2.html /camel-quarkus/next/reference/extensions/aws-ec2.html
-Redirect 301 /camel-quarkus/latest/extensions/aws-ecs.html /camel-quarkus/next/reference/extensions/aws-ecs.html
-Redirect 301 /camel-quarkus/latest/extensions/aws-eks.html /camel-quarkus/next/reference/extensions/aws-eks.html
-Redirect 301 /camel-quarkus/latest/extensions/aws-iam.html /camel-quarkus/next/reference/extensions/aws-iam.html
-Redirect 301 /camel-quarkus/latest/extensions/aws-kinesis.html /camel-quarkus/next/reference/extensions/aws-kinesis.html
-Redirect 301 /camel-quarkus/latest/extensions/aws-kms.html /camel-quarkus/next/reference/extensions/aws-kms.html
-Redirect 301 /camel-quarkus/latest/extensions/aws-lambda.html /camel-quarkus/next/reference/extensions/aws-lambda.html
-Redirect 301 /camel-quarkus/latest/extensions/aws-s3.html /camel-quarkus/next/reference/extensions/aws-s3.html
-Redirect 301 /camel-quarkus/latest/extensions/aws-sdb.html /camel-quarkus/next/reference/extensions/aws-sdb.html
-Redirect 301 /camel-quarkus/latest/extensions/aws-sns.html /camel-quarkus/next/reference/extensions/aws-sns.html
-Redirect 301 /camel-quarkus/latest/extensions/aws-sqs.html /camel-quarkus/next/reference/extensions/aws-sqs.html
-Redirect 301 /camel-quarkus/latest/extensions/aws-swf.html /camel-quarkus/next/reference/extensions/aws-swf.html
-Redirect 301 /camel-quarkus/latest/extensions/aws-translate.html /camel-quarkus/next/reference/extensions/aws-translate.html
-Redirect 301 /camel-quarkus/latest/extensions/aws2-athena.html /camel-quarkus/next/reference/extensions/aws2-athena.html
-Redirect 301 /camel-quarkus/latest/extensions/aws2-cw.html /camel-quarkus/next/reference/extensions/aws2-cw.html
-Redirect 301 /camel-quarkus/latest/extensions/aws2-ddb.html /camel-quarkus/next/reference/extensions/aws2-ddb.html
-Redirect 301 /camel-quarkus/latest/extensions/aws2-ec2.html /camel-quarkus/next/reference/extensions/aws2-ec2.html
-Redirect 301 /camel-quarkus/latest/extensions/aws2-ecs.html /camel-quarkus/next/reference/extensions/aws2-ecs.html
-Redirect 301 /camel-quarkus/latest/extensions/aws2-eks.html /camel-quarkus/next/reference/extensions/aws2-eks.html
-Redirect 301 /camel-quarkus/latest/extensions/aws2-iam.html /camel-quarkus/next/reference/extensions/aws2-iam.html
-Redirect 301 /camel-quarkus/latest/extensions/aws2-kms.html /camel-quarkus/next/reference/extensions/aws2-kms.html
-Redirect 301 /camel-quarkus/latest/extensions/aws2-mq.html /camel-quarkus/next/reference/extensions/aws2-mq.html
-Redirect 301 /camel-quarkus/latest/extensions/aws2-msk.html /camel-quarkus/next/reference/extensions/aws2-msk.html
-Redirect 301 /camel-quarkus/latest/extensions/aws2-s3.html /camel-quarkus/next/reference/extensions/aws2-s3.html
-Redirect 301 /camel-quarkus/latest/extensions/aws2-ses.html /camel-quarkus/next/reference/extensions/aws2-ses.html
-Redirect 301 /camel-quarkus/latest/extensions/aws2-sns.html /camel-quarkus/next/reference/extensions/aws2-sns.html
-Redirect 301 /camel-quarkus/latest/extensions/aws2-sqs.html /camel-quarkus/next/reference/extensions/aws2-sqs.html
-Redirect 301 /camel-quarkus/latest/extensions/aws2-translate.html /camel-quarkus/next/reference/extensions/aws2-translate.html
-Redirect 301 /camel-quarkus/latest/extensions/azure.html /camel-quarkus/next/reference/extensions/azure.html
-Redirect 301 /camel-quarkus/latest/extensions/base64.html /camel-quarkus/next/reference/extensions/base64.html
-Redirect 301 /camel-quarkus/latest/extensions/bean-validator.html /camel-quarkus/next/reference/extensions/bean-validator.html
-Redirect 301 /camel-quarkus/latest/extensions/bean.html /camel-quarkus/next/reference/extensions/bean.html
-Redirect 301 /camel-quarkus/latest/extensions/bindy.html /camel-quarkus/next/reference/extensions/bindy.html
-Redirect 301 /camel-quarkus/latest/extensions/box.html /camel-quarkus/next/reference/extensions/box.html
-Redirect 301 /camel-quarkus/latest/extensions/braintree.html /camel-quarkus/next/reference/extensions/braintree.html
-Redirect 301 /camel-quarkus/latest/extensions/caffeine-lrucache.html /camel-quarkus/next/reference/extensions/caffeine-lrucache.html
-Redirect 301 /camel-quarkus/latest/extensions/cassandraql.html /camel-quarkus/next/reference/extensions/cassandraql.html
-Redirect 301 /camel-quarkus/latest/extensions/componentdsl.html /camel-quarkus/next/reference/extensions/componentdsl.html
-Redirect 301 /camel-quarkus/latest/extensions/consul.html /camel-quarkus/next/reference/extensions/consul.html
-Redirect 301 /camel-quarkus/latest/extensions/controlbus.html /camel-quarkus/next/reference/extensions/controlbus.html
-Redirect 301 /camel-quarkus/latest/extensions/core-cloud.html /camel-quarkus/next/reference/extensions/core-cloud.html
-Redirect 301 /camel-quarkus/latest/extensions/core.html /camel-quarkus/next/reference/extensions/core.html
-Redirect 301 /camel-quarkus/latest/extensions/couchbase.html /camel-quarkus/next/reference/extensions/couchbase.html
-Redirect 301 /camel-quarkus/latest/extensions/couchdb.html /camel-quarkus/next/reference/extensions/couchdb.html
-Redirect 301 /camel-quarkus/latest/extensions/cron.html /camel-quarkus/next/reference/extensions/cron.html
-Redirect 301 /camel-quarkus/latest/extensions/csv.html /camel-quarkus/next/reference/extensions/csv.html
-Redirect 301 /camel-quarkus/latest/extensions/dataformat.html /camel-quarkus/next/reference/extensions/dataformat.html
-Redirect 301 /camel-quarkus/latest/extensions/debezium-mongodb.html /camel-quarkus/next/reference/extensions/debezium-mongodb.html
-Redirect 301 /camel-quarkus/latest/extensions/debezium-mysql.html /camel-quarkus/next/reference/extensions/debezium-mysql.html
-Redirect 301 /camel-quarkus/latest/extensions/debezium-postgres.html /camel-quarkus/next/reference/extensions/debezium-postgres.html
-Redirect 301 /camel-quarkus/latest/extensions/debezium-sqlserver.html /camel-quarkus/next/reference/extensions/debezium-sqlserver.html
-Redirect 301 /camel-quarkus/latest/extensions/direct.html /camel-quarkus/next/reference/extensions/direct.html
-Redirect 301 /camel-quarkus/latest/extensions/dozer.html /camel-quarkus/next/reference/extensions/dozer.html
-Redirect 301 /camel-quarkus/latest/extensions/elasticsearch-rest.html /camel-quarkus/next/reference/extensions/elasticsearch-rest.html
-Redirect 301 /camel-quarkus/latest/extensions/endpointdsl.html /camel-quarkus/next/reference/extensions/endpointdsl.html
-Redirect 301 /camel-quarkus/latest/extensions/exec.html /camel-quarkus/next/reference/extensions/exec.html
-Redirect 301 /camel-quarkus/latest/extensions/fhir.html /camel-quarkus/next/reference/extensions/fhir.html
-Redirect 301 /camel-quarkus/latest/extensions/file-watch.html /camel-quarkus/next/reference/extensions/file-watch.html
-Redirect 301 /camel-quarkus/latest/extensions/file.html /camel-quarkus/next/reference/extensions/file.html
-Redirect 301 /camel-quarkus/latest/extensions/ftp.html /camel-quarkus/next/reference/extensions/ftp.html
-Redirect 301 /camel-quarkus/latest/extensions/github.html /camel-quarkus/next/reference/extensions/github.html
-Redirect 301 /camel-quarkus/latest/extensions/google-bigquery.html /camel-quarkus/next/reference/extensions/google-bigquery.html
-Redirect 301 /camel-quarkus/latest/extensions/google-calendar.html /camel-quarkus/next/reference/extensions/google-calendar.html
-Redirect 301 /camel-quarkus/latest/extensions/google-drive.html /camel-quarkus/next/reference/extensions/google-drive.html
-Redirect 301 /camel-quarkus/latest/extensions/google-mail.html /camel-quarkus/next/reference/extensions/google-mail.html
-Redirect 301 /camel-quarkus/latest/extensions/google-pubsub.html /camel-quarkus/next/reference/extensions/google-pubsub.html
-Redirect 301 /camel-quarkus/latest/extensions/google-sheets.html /camel-quarkus/next/reference/extensions/google-sheets.html
-Redirect 301 /camel-quarkus/latest/extensions/graphql.html /camel-quarkus/next/reference/extensions/graphql.html
-Redirect 301 /camel-quarkus/latest/extensions/grok.html /camel-quarkus/next/reference/extensions/grok.html
-Redirect 301 /camel-quarkus/latest/extensions/groovy.html /camel-quarkus/next/reference/extensions/groovy.html
-Redirect 301 /camel-quarkus/latest/extensions/grpc.html /camel-quarkus/next/reference/extensions/grpc.html
-Redirect 301 /camel-quarkus/latest/extensions/gson.html /camel-quarkus/next/reference/extensions/gson.html
-Redirect 301 /camel-quarkus/latest/extensions/http.html /camel-quarkus/next/reference/extensions/http.html
-Redirect 301 /camel-quarkus/latest/extensions/hystrix.html /camel-quarkus/next/reference/extensions/hystrix.html
-Redirect 301 /camel-quarkus/latest/extensions/ical.html /camel-quarkus/next/reference/extensions/ical.html
-Redirect 301 /camel-quarkus/latest/extensions/infinispan.html /camel-quarkus/next/reference/extensions/infinispan.html
-Redirect 301 /camel-quarkus/latest/extensions/influxdb.html /camel-quarkus/next/reference/extensions/influxdb.html
-Redirect 301 /camel-quarkus/latest/extensions/jackson.html /camel-quarkus/next/reference/extensions/jackson.html
-Redirect 301 /camel-quarkus/latest/extensions/jacksonxml.html /camel-quarkus/next/reference/extensions/jacksonxml.html
-Redirect 301 /camel-quarkus/latest/extensions/jaxb.html /camel-quarkus/next/reference/extensions/jaxb.html
-Redirect 301 /camel-quarkus/latest/extensions/jdbc.html /camel-quarkus/next/reference/extensions/jdbc.html
-Redirect 301 /camel-quarkus/latest/extensions/jira.html /camel-quarkus/next/reference/extensions/jira.html
-Redirect 301 /camel-quarkus/latest/extensions/jms.html /camel-quarkus/next/reference/extensions/jms.html
-Redirect 301 /camel-quarkus/latest/extensions/johnzon.html /camel-quarkus/next/reference/extensions/johnzon.html
-Redirect 301 /camel-quarkus/latest/extensions/jolt.html /camel-quarkus/next/reference/extensions/jolt.html
-Redirect 301 /camel-quarkus/latest/extensions/jpa.html /camel-quarkus/next/reference/extensions/jpa.html
-Redirect 301 /camel-quarkus/latest/extensions/json-validator.html /camel-quarkus/next/reference/extensions/json-validator.html
-Redirect 301 /camel-quarkus/latest/extensions/jsonpath.html /camel-quarkus/next/reference/extensions/jsonpath.html
-Redirect 301 /camel-quarkus/latest/extensions/jta.html /camel-quarkus/next/reference/extensions/jta.html
-Redirect 301 /camel-quarkus/latest/extensions/kafka.html /camel-quarkus/next/reference/extensions/kafka.html
-Redirect 301 /camel-quarkus/latest/extensions/kotlin.html /camel-quarkus/next/reference/extensions/kotlin.html
-Redirect 301 /camel-quarkus/latest/extensions/kubernetes.html /camel-quarkus/next/reference/extensions/kubernetes.html
-Redirect 301 /camel-quarkus/latest/extensions/kudu.html /camel-quarkus/next/reference/extensions/kudu.html
-Redirect 301 /camel-quarkus/latest/extensions/log.html /camel-quarkus/next/reference/extensions/log.html
-Redirect 301 /camel-quarkus/latest/extensions/lzf.html /camel-quarkus/next/reference/extensions/lzf.html
-Redirect 301 /camel-quarkus/latest/extensions/mail.html /camel-quarkus/next/reference/extensions/mail.html
-Redirect 301 /camel-quarkus/latest/extensions/main.html /camel-quarkus/next/reference/extensions/main.html
-Redirect 301 /camel-quarkus/latest/extensions/master.html /camel-quarkus/next/reference/extensions/master.html
-Redirect 301 /camel-quarkus/latest/extensions/microprofile-fault-tolerance.html /camel-quarkus/next/reference/extensions/microprofile-fault-tolerance.html
-Redirect 301 /camel-quarkus/latest/extensions/microprofile-health.html /camel-quarkus/next/reference/extensions/microprofile-health.html
-Redirect 301 /camel-quarkus/latest/extensions/microprofile-metrics.html /camel-quarkus/next/reference/extensions/microprofile-metrics.html
-Redirect 301 /camel-quarkus/latest/extensions/mock.html /camel-quarkus/next/reference/extensions/mock.html
-Redirect 301 /camel-quarkus/latest/extensions/mongodb-gridfs.html /camel-quarkus/next/reference/extensions/mongodb-gridfs.html
-Redirect 301 /camel-quarkus/latest/extensions/mongodb.html /camel-quarkus/next/reference/extensions/mongodb.html
-Redirect 301 /camel-quarkus/latest/extensions/mustache.html /camel-quarkus/next/reference/extensions/mustache.html
-Redirect 301 /camel-quarkus/latest/extensions/netty-http.html /camel-quarkus/next/reference/extensions/netty-http.html
-Redirect 301 /camel-quarkus/latest/extensions/netty.html /camel-quarkus/next/reference/extensions/netty.html
-Redirect 301 /camel-quarkus/latest/extensions/nitrite.html /camel-quarkus/next/reference/extensions/nitrite.html
-Redirect 301 /camel-quarkus/latest/extensions/ognl.html /camel-quarkus/next/reference/extensions/ognl.html
-Redirect 301 /camel-quarkus/latest/extensions/olingo4.html /camel-quarkus/next/reference/extensions/olingo4.html
-Redirect 301 /camel-quarkus/latest/extensions/openapi-java.html /camel-quarkus/next/reference/extensions/openapi-java.html
-Redirect 301 /camel-quarkus/latest/extensions/openstack.html /camel-quarkus/next/reference/extensions/openstack.html
-Redirect 301 /camel-quarkus/latest/extensions/opentracing.html /camel-quarkus/next/reference/extensions/opentracing.html
-Redirect 301 /camel-quarkus/latest/extensions/paho.html /camel-quarkus/next/reference/extensions/paho.html
-Redirect 301 /camel-quarkus/latest/extensions/pdf.html /camel-quarkus/next/reference/extensions/pdf.html
-Redirect 301 /camel-quarkus/latest/extensions/platform-http.html /camel-quarkus/next/reference/extensions/platform-http.html
-Redirect 301 /camel-quarkus/latest/extensions/protobuf.html /camel-quarkus/next/reference/extensions/protobuf.html
-Redirect 301 /camel-quarkus/latest/extensions/pubnub.html /camel-quarkus/next/reference/extensions/pubnub.html
-Redirect 301 /camel-quarkus/latest/extensions/quartz.html /camel-quarkus/next/reference/extensions/quartz.html
-Redirect 301 /camel-quarkus/latest/extensions/qute.html /camel-quarkus/next/reference/extensions/qute.html
-Redirect 301 /camel-quarkus/latest/extensions/rabbitmq.html /camel-quarkus/next/reference/extensions/rabbitmq.html
-Redirect 301 /camel-quarkus/latest/extensions/reactive-executor.html /camel-quarkus/next/reference/extensions/reactive-executor.html
-Redirect 301 /camel-quarkus/latest/extensions/reactive-streams.html /camel-quarkus/next/reference/extensions/reactive-streams.html
-Redirect 301 /camel-quarkus/latest/extensions/ref.html /camel-quarkus/next/reference/extensions/ref.html
-Redirect 301 /camel-quarkus/latest/extensions/rest-openapi.html /camel-quarkus/next/reference/extensions/rest-openapi.html
-Redirect 301 /camel-quarkus/latest/extensions/rest.html /camel-quarkus/next/reference/extensions/rest.html
-Redirect 301 /camel-quarkus/latest/extensions/salesforce.html /camel-quarkus/next/reference/extensions/salesforce.html
-Redirect 301 /camel-quarkus/latest/extensions/sap-netweaver.html /camel-quarkus/next/reference/extensions/sap-netweaver.html
-Redirect 301 /camel-quarkus/latest/extensions/scheduler.html /camel-quarkus/next/reference/extensions/scheduler.html
-Redirect 301 /camel-quarkus/latest/extensions/seda.html /camel-quarkus/next/reference/extensions/seda.html
-Redirect 301 /camel-quarkus/latest/extensions/servicenow.html /camel-quarkus/next/reference/extensions/servicenow.html
-Redirect 301 /camel-quarkus/latest/extensions/servlet.html /camel-quarkus/next/reference/extensions/servlet.html
-Redirect 301 /camel-quarkus/latest/extensions/sjms.html /camel-quarkus/next/reference/extensions/sjms.html
-Redirect 301 /camel-quarkus/latest/extensions/sjms2.html /camel-quarkus/next/reference/extensions/sjms2.html
-Redirect 301 /camel-quarkus/latest/extensions/slack.html /camel-quarkus/next/reference/extensions/slack.html
-Redirect 301 /camel-quarkus/latest/extensions/smallrye-reactive-messaging.html /camel-quarkus/next/reference/extensions/smallrye-reactive-messaging.html
-Redirect 301 /camel-quarkus/latest/extensions/snakeyaml.html /camel-quarkus/next/reference/extensions/snakeyaml.html
-Redirect 301 /camel-quarkus/latest/extensions/soap.html /camel-quarkus/next/reference/extensions/soap.html
-Redirect 301 /camel-quarkus/latest/extensions/sql.html /camel-quarkus/next/reference/extensions/sql.html
-Redirect 301 /camel-quarkus/latest/extensions/stream.html /camel-quarkus/next/reference/extensions/stream.html
-Redirect 301 /camel-quarkus/latest/extensions/tagsoup.html /camel-quarkus/next/reference/extensions/tagsoup.html
-Redirect 301 /camel-quarkus/latest/extensions/tarfile.html /camel-quarkus/next/reference/extensions/tarfile.html
-Redirect 301 /camel-quarkus/latest/extensions/telegram.html /camel-quarkus/next/reference/extensions/telegram.html
-Redirect 301 /camel-quarkus/latest/extensions/tika.html /camel-quarkus/next/reference/extensions/tika.html
-Redirect 301 /camel-quarkus/latest/extensions/timer.html /camel-quarkus/next/reference/extensions/timer.html
-Redirect 301 /camel-quarkus/latest/extensions/twitter.html /camel-quarkus/next/reference/extensions/twitter.html
-Redirect 301 /camel-quarkus/latest/extensions/validator.html /camel-quarkus/next/reference/extensions/validator.html
-Redirect 301 /camel-quarkus/latest/extensions/vertx.html /camel-quarkus/next/reference/extensions/vertx.html
-Redirect 301 /camel-quarkus/latest/extensions/vm.html /camel-quarkus/next/reference/extensions/vm.html
-Redirect 301 /camel-quarkus/latest/extensions/websocket-jsr356.html /camel-quarkus/next/reference/extensions/websocket-jsr356.html
-Redirect 301 /camel-quarkus/latest/extensions/xml-io.html /camel-quarkus/next/reference/extensions/xml-io.html
-Redirect 301 /camel-quarkus/latest/extensions/xml-jaxb.html /camel-quarkus/next/reference/extensions/xml-jaxb.html
-Redirect 301 /camel-quarkus/latest/extensions/xml-jaxp.html /camel-quarkus/next/reference/extensions/xml-jaxp.html
-Redirect 301 /camel-quarkus/latest/extensions/xpath.html /camel-quarkus/next/reference/extensions/xpath.html
-Redirect 301 /camel-quarkus/latest/extensions/xslt.html /camel-quarkus/next/reference/extensions/xslt.html
-Redirect 301 /camel-quarkus/latest/extensions/xstream.html /camel-quarkus/next/reference/extensions/xstream.html
-Redirect 301 /camel-quarkus/latest/extensions/zip-deflater.html /camel-quarkus/next/reference/extensions/zip-deflater.html
-Redirect 301 /camel-quarkus/latest/extensions/zipfile.html /camel-quarkus/next/reference/extensions/zipfile.html
-# camel-quarkus end
 # camel-kafka-connect start
 Redirect 301 /camel-kafka-connector/latest/connectors.html /camel-kafka-connector/latest/reference/index.html
 # camel-kafka-connect end
@@ -1283,31 +1102,8 @@ Redirect 301 /blog/release-3-4-4.html /blog/2020/09/RELEASE-3.4.4/
 Redirect 301 /blog/release-3-5-0.html /blog/2020/09/RELEASE-3.5.0/
 Redirect 301 /blog/release-3-6-0.html /blog/2020/09/RELEASE-3.6.0/
 
-# if the request can serve the file, serve it don't evaluate rules below
-RewriteCond %{REQUEST_FILENAME} !-f
-
-# request for `/<Antora component>` with either `/latest` or not `/next`,
-# eating up the next `/` if it exists and capturing everything after that
-# get redirected to `/<Antora component>/next/<what was captured>`
-# NOTES:
-#  * no / at the beginning in the rule, i.e. starts with `^(components...`
-#    as `RewriteBase` is set to `/`, so no slash prefix here
-#  * first group captures the current component name
-#  * next group eats `/latest` or doesn't match `/next` but consumes both
-#    the negative match against `/next` is to prevent redirect loops for
-#    urls with `/next` in them (e.g. `/<Antora component/next/...`)
-#  * optionaly matching `/` consumes the `/` if it's there so we can
-#    add the `/` so `/components/next` becomes `/components/next/` but
-#    `/components/next/` doesn't become `/components/next//`
-#  * we need to be careful with Antora componets with the same prefixes
-#    e.g. camel-k, camel-karaf and camel-kafka-connector, so we don't match
-#    partialy and capture the rest of the Antora component name in subsequent
-#    groups, that's why we have the negative lookahead in the camel-k option
-RewriteRule ^(components|camel-spring-boot|(?:camel-k(?!afka-connector|araf|amelets)|camel-kafka-connector|camel-karaf|camel-kamelets)|camel-quarkus)(?|(/latest)|(?!/next))/?(.*)$ /$1/next/$3 [R=permanent,L]
-
-# manual is now unversioned
-Redirect 301 /manual/latest/ /manual/
-Redirect 301 /manual/latest /manual/
+<!-- inject:htaccess -->
+<!-- endinject -->
 
 # Disable the pattern matching based on filenames.
 #
diff --git a/tests/redirect.sh b/tests/redirect.sh
index da3ba19..49e8124 100755
--- a/tests/redirect.sh
+++ b/tests/redirect.sh
@@ -1,4 +1,4 @@
-#!/bin/env bash
+#!/bin/sh
 
 BASE_URL="${1:-https://localhost}"
 
@@ -16,72 +16,91 @@ function test {
   fi
 }
 
-test $BASE_URL/components 301 $BASE_URL/components/next/
-test $BASE_URL/components/ 301 $BASE_URL/components/next/
+C_V="3.13.x"
+CK_V="1.6.x"
+CKC_V="0.11.0"
+CQ_V="2.4.x"
+
+test $BASE_URL/components 302 $BASE_URL/components/${C_V}/
+test $BASE_URL/components/ 302 $BASE_URL/components/${C_V}/
 test $BASE_URL/components/next 301 $BASE_URL/components/next/
 test $BASE_URL/components/next/ 200
-test $BASE_URL/components/latest 301 $BASE_URL/components/next/
-test $BASE_URL/components/latest/ 301 $BASE_URL/components/next/
-test $BASE_URL/components/latest/activemq-component.html 301 $BASE_URL/components/next/activemq-component.html
+test $BASE_URL/components/latest 302 $BASE_URL/components/${C_V}
+test $BASE_URL/components/latest/ 302 $BASE_URL/components/${C_V}/
+test $BASE_URL/components/activemq-component.html 302 $BASE_URL/components/${C_V}/activemq-component.html
+test $BASE_URL/components/latest/activemq-component.html 302 $BASE_URL/components/${C_V}/activemq-component.html
+test $BASE_URL/components/${C_V}/activemq-component.html 200
 test $BASE_URL/components/next/activemq-component.html 200
 
-test $BASE_URL/camel-spring-boot 301 $BASE_URL/camel-spring-boot/next/
-test $BASE_URL/camel-spring-boot/ 301 $BASE_URL/camel-spring-boot/next/
+test $BASE_URL/camel-spring-boot 302 $BASE_URL/camel-spring-boot/${C_V}/
+test $BASE_URL/camel-spring-boot/ 302 $BASE_URL/camel-spring-boot/${C_V}/
 test $BASE_URL/camel-spring-boot/next 301 $BASE_URL/camel-spring-boot/next/
 test $BASE_URL/camel-spring-boot/next/ 200
-test $BASE_URL/camel-spring-boot/latest 301 $BASE_URL/camel-spring-boot/next/
-test $BASE_URL/camel-spring-boot/latest/ 301 $BASE_URL/camel-spring-boot/next/
-test $BASE_URL/camel-spring-boot/latest/list.html 301 $BASE_URL/camel-spring-boot/next/list.html
+test $BASE_URL/camel-spring-boot/latest 302 $BASE_URL/camel-spring-boot/${C_V}
+test $BASE_URL/camel-spring-boot/latest/ 302 $BASE_URL/camel-spring-boot/${C_V}/
+test $BASE_URL/camel-spring-boot/list.html 302 $BASE_URL/camel-spring-boot/${C_V}/list.html
+test $BASE_URL/camel-spring-boot/latest/list.html 302 $BASE_URL/camel-spring-boot/${C_V}/list.html
+test $BASE_URL/camel-spring-boot/${C_V}/list.html 200
 test $BASE_URL/camel-spring-boot/next/list.html 200
 
-test $BASE_URL/camel-k 301 $BASE_URL/camel-k/next/
-test $BASE_URL/camel-k/ 301 $BASE_URL/camel-k/next/
+test $BASE_URL/camel-k 302 $BASE_URL/camel-k/${CK_V}/
+test $BASE_URL/camel-k/ 302 $BASE_URL/camel-k/${CK_V}/
 test $BASE_URL/camel-k/next 301 $BASE_URL/camel-k/next/
 test $BASE_URL/camel-k/next/ 200
-test $BASE_URL/camel-k/latest 301 $BASE_URL/camel-k/next/
-test $BASE_URL/camel-k/latest/ 301 $BASE_URL/camel-k/next/
-test $BASE_URL/camel-k/latest/traits/master.html 301 $BASE_URL/camel-k/next/traits/master.html
+test $BASE_URL/camel-k/latest 302 $BASE_URL/camel-k/${CK_V}
+test $BASE_URL/camel-k/latest/ 302 $BASE_URL/camel-k/${CK_V}/
+test $BASE_URL/camel-k/traits/master.html 302 $BASE_URL/camel-k/${CK_V}/traits/master.html
+test $BASE_URL/camel-k/latest/traits/master.html 302 $BASE_URL/camel-k/${CK_V}/traits/master.html
+test $BASE_URL/camel-k/${CK_V}/traits/master.html 200
 test $BASE_URL/camel-k/next/traits/master.html 200
 
-test $BASE_URL/camel-karaf 301 $BASE_URL/camel-karaf/next/
-test $BASE_URL/camel-karaf/ 301 $BASE_URL/camel-karaf/next/
+test $BASE_URL/camel-karaf 302 $BASE_URL/camel-karaf/${C_V}/
+test $BASE_URL/camel-karaf/ 302 $BASE_URL/camel-karaf/${C_V}/
 test $BASE_URL/camel-karaf/next 301 $BASE_URL/camel-karaf/next/
 test $BASE_URL/camel-karaf/next/ 200
-test $BASE_URL/camel-karaf/latest 301 $BASE_URL/camel-karaf/next/
-test $BASE_URL/camel-karaf/latest/ 301 $BASE_URL/camel-karaf/next/
-test $BASE_URL/camel-karaf/latest/components.html 301 $BASE_URL/camel-karaf/next/components.html
+test $BASE_URL/camel-karaf/latest 302 $BASE_URL/camel-karaf/${C_V}
+test $BASE_URL/camel-karaf/latest/ 302 $BASE_URL/camel-karaf/${C_V}/
+test $BASE_URL/camel-karaf/latest/components.html 302 $BASE_URL/camel-karaf/${C_V}/components.html
+test $BASE_URL/camel-karaf/latest/components.html 302 $BASE_URL/camel-karaf/${C_V}/components.html
+test $BASE_URL/camel-karaf/${C_V}/components.html 200
 test $BASE_URL/camel-karaf/next/components.html 200
 
-test $BASE_URL/camel-kafka-connector 301 $BASE_URL/camel-kafka-connector/next/
-test $BASE_URL/camel-kafka-connector/ 301 $BASE_URL/camel-kafka-connector/next/
+test $BASE_URL/camel-kafka-connector 302 $BASE_URL/camel-kafka-connector/${CKC_V}/
+test $BASE_URL/camel-kafka-connector/ 302 $BASE_URL/camel-kafka-connector/${CKC_V}/
 test $BASE_URL/camel-kafka-connector/next 301 $BASE_URL/camel-kafka-connector/next/
 test $BASE_URL/camel-kafka-connector/next/ 200
-test $BASE_URL/camel-kafka-connector/latest 301 $BASE_URL/camel-kafka-connector/next/
-test $BASE_URL/camel-kafka-connector/latest/ 301 $BASE_URL/camel-kafka-connector/next/
-test $BASE_URL/camel-kafka-connector/latest/contributor-guide/release-guide.html 301 $BASE_URL/camel-kafka-connector/next/contributor-guide/release-guide.html
+test $BASE_URL/camel-kafka-connector/latest 302 $BASE_URL/camel-kafka-connector/${CKC_V}
+test $BASE_URL/camel-kafka-connector/latest/ 302 $BASE_URL/camel-kafka-connector/${CKC_V}/
+test $BASE_URL/camel-kafka-connector/contributor-guide/release-guide.html 302 $BASE_URL/camel-kafka-connector/${CKC_V}/contributor-guide/release-guide.html
+test $BASE_URL/camel-kafka-connector/latest/contributor-guide/release-guide.html 302 $BASE_URL/camel-kafka-connector/${CKC_V}/contributor-guide/release-guide.html
+test $BASE_URL/camel-kafka-connector/${CKC_V}/contributor-guide/release-guide.html 200
 test $BASE_URL/camel-kafka-connector/next/contributor-guide/release-guide.html 200
 
-test $BASE_URL/camel-kamelets 301 $BASE_URL/camel-kamelets/next/
-test $BASE_URL/camel-kamelets/ 301 $BASE_URL/camel-kamelets/next/
+test $BASE_URL/camel-kamelets 302 $BASE_URL/camel-kamelets/next/
+test $BASE_URL/camel-kamelets/ 302 $BASE_URL/camel-kamelets/next/
 test $BASE_URL/camel-kamelets/next 301 $BASE_URL/camel-kamelets/next/
 test $BASE_URL/camel-kamelets/next/ 200
-test $BASE_URL/camel-kamelets/latest 301 $BASE_URL/camel-kamelets/next/
-test $BASE_URL/camel-kamelets/latest/ 301 $BASE_URL/camel-kamelets/next/
-test $BASE_URL/camel-kamelets/latest/github-source.html 301 $BASE_URL/camel-kamelets/next/github-source.html
+test $BASE_URL/camel-kamelets/latest 302 $BASE_URL/camel-kamelets/next
+test $BASE_URL/camel-kamelets/latest/ 302 $BASE_URL/camel-kamelets/next/
+test $BASE_URL/camel-kamelets/github-source.html 302 $BASE_URL/camel-kamelets/next/github-source.html
+test $BASE_URL/camel-kamelets/latest/github-source.html 302 $BASE_URL/camel-kamelets/next/github-source.html
+test $BASE_URL/camel-kamelets/next/github-source.html 200
 test $BASE_URL/camel-kamelets/next/github-source.html 200
 
-test $BASE_URL/camel-quarkus 301 $BASE_URL/camel-quarkus/next/
-test $BASE_URL/camel-quarkus/ 301 $BASE_URL/camel-quarkus/next/
+test $BASE_URL/camel-quarkus 302 $BASE_URL/camel-quarkus/${CQ_V}/
+test $BASE_URL/camel-quarkus/ 302 $BASE_URL/camel-quarkus/${CQ_V}/
 test $BASE_URL/camel-quarkus/next 301 $BASE_URL/camel-quarkus/next/
 test $BASE_URL/camel-quarkus/next/ 200
-test $BASE_URL/camel-quarkus/latest 301 $BASE_URL/camel-quarkus/next/
-test $BASE_URL/camel-quarkus/latest/ 301 $BASE_URL/camel-quarkus/next/
-test $BASE_URL/camel-quarkus/latest/user-guide/cdi.html 301 $BASE_URL/camel-quarkus/next/user-guide/cdi.html
+test $BASE_URL/camel-quarkus/latest 302 $BASE_URL/camel-quarkus/${CQ_V}
+test $BASE_URL/camel-quarkus/latest/ 302 $BASE_URL/camel-quarkus/${CQ_V}/
+test $BASE_URL/camel-quarkus/user-guide/cdi.html 302 $BASE_URL/camel-quarkus/${CQ_V}/user-guide/cdi.html
+test $BASE_URL/camel-quarkus/latest/user-guide/cdi.html 302 $BASE_URL/camel-quarkus/${CQ_V}/user-guide/cdi.html
+test $BASE_URL/camel-quarkus/${CQ_V}/user-guide/cdi.html 200
 test $BASE_URL/camel-quarkus/next/user-guide/cdi.html 200
 
 test $BASE_URL/manual 301 $BASE_URL/manual/
-test $BASE_URL/manual/latest 301 $BASE_URL/manual/
-test $BASE_URL/manual/latest/ 301 $BASE_URL/manual/
-test $BASE_URL/manual/latest/component-dsl.html 301 $BASE_URL/manual/component-dsl.html
+test $BASE_URL/manual/latest 302 $BASE_URL/manual
+test $BASE_URL/manual/latest/ 302 $BASE_URL/manual/
+test $BASE_URL/manual/latest/component-dsl.html 302 $BASE_URL/manual/component-dsl.html
 test $BASE_URL/manual/ 200
 test $BASE_URL/manual/component-dsl.html 200