| #!/usr/bin/env bash |
| # Local verification harness for static/.htaccess. Does NOT build the site — |
| # only stages the dummy files needed to exercise the rewrite rules. |
| # |
| # Usage: |
| # bash scripts/verify-htaccess.sh start # boot httpd in foreground (Ctrl-C to stop) |
| # bash scripts/verify-htaccess.sh test # run curl assertions in another shell |
| set -euo pipefail |
| |
| ROOT="${TMPDIR:-/tmp}/doris-htaccess-test" |
| PORT=8000 |
| HTACCESS_SRC="$(cd "$(dirname "$0")/.." && pwd)/static/.htaccess" |
| |
| stage() { |
| rm -rf "$ROOT" |
| mkdir -p "$ROOT"/{docs/dev/install,docs/dev/getting-started/what-is-apache-doris,zh-CN/docs/dev/getting-started/what-is-apache-doris} |
| cp "$HTACCESS_SRC" "$ROOT/.htaccess" |
| |
| printf 'GENERIC_404\n' > "$ROOT/404.html" |
| printf 'ZH_404\n' > "$ROOT/zh-CN/404.html" |
| # Simulate a file emitted by Docusaurus build — must short-circuit the rewrite. |
| printf 'EXISTING_REDIRECT_FILE\n' > "$ROOT/docs/dev/install/index.html" |
| # The eventual 301 target. |
| printf 'NEW_DEV_LANDING\n' > "$ROOT/docs/dev/getting-started/what-is-apache-doris/index.html" |
| printf 'ZH_NEW_DEV_LANDING\n' > "$ROOT/zh-CN/docs/dev/getting-started/what-is-apache-doris/index.html" |
| |
| cat > "$ROOT/httpd.conf" <<EOF |
| ServerName localhost |
| Listen $PORT |
| LoadModule mpm_event_module /usr/libexec/apache2/mod_mpm_event.so |
| LoadModule unixd_module /usr/libexec/apache2/mod_unixd.so |
| LoadModule authz_core_module /usr/libexec/apache2/mod_authz_core.so |
| LoadModule rewrite_module /usr/libexec/apache2/mod_rewrite.so |
| LoadModule headers_module /usr/libexec/apache2/mod_headers.so |
| LoadModule dir_module /usr/libexec/apache2/mod_dir.so |
| LoadModule mime_module /usr/libexec/apache2/mod_mime.so |
| LoadModule log_config_module /usr/libexec/apache2/mod_log_config.so |
| |
| TypesConfig /private/etc/apache2/mime.types |
| DirectoryIndex index.html |
| |
| ErrorLog $ROOT/error.log |
| PidFile $ROOT/httpd.pid |
| LogLevel warn rewrite:trace3 |
| |
| DocumentRoot "$ROOT" |
| <Directory "$ROOT"> |
| AllowOverride All |
| Require all granted |
| </Directory> |
| EOF |
| } |
| |
| case "${1:-}" in |
| start) |
| stage |
| echo "[stage] root: $ROOT" |
| echo "[stage] running httpd on http://localhost:$PORT (Ctrl-C to stop)" |
| echo "[stage] rewrite trace: tail -f $ROOT/error.log" |
| exec /usr/sbin/httpd -f "$ROOT/httpd.conf" -X |
| ;; |
| test) |
| BASE="http://localhost:$PORT" |
| run() { |
| local desc="$1" url="$2" want_code="$3" want_body_or_loc="$4" |
| local out code loc body |
| out="$(curl -sS -o "$ROOT/last-body" -w '%{http_code} %{redirect_url}' "$BASE$url")" |
| code="${out%% *}" |
| loc="${out#* }" |
| body="$(tr -d '\r\n' < "$ROOT/last-body")" |
| local got |
| if [[ "$want_code" == 301 ]]; then got="$loc"; else got="$body"; fi |
| if [[ "$code" == "$want_code" && "$got" == *"$want_body_or_loc"* ]]; then |
| echo "PASS $desc -> $code" |
| else |
| echo "FAIL $desc url=$url expected=$want_code/$want_body_or_loc got=$code/$got" |
| exit 1 |
| fi |
| } |
| run '/docs/dev/<missing> -> 301 Dev landing' '/docs/dev/gettingStarted/intro' 301 '/docs/dev/getting-started/what-is-apache-doris' |
| run '/docs/dev/install/ -> 200 existing build file' '/docs/dev/install/' 200 'EXISTING_REDIRECT_FILE' |
| run 'zh-CN /docs/dev/<missing> -> 301 zh-CN Dev landing' '/zh-CN/docs/dev/whatever' 301 '/zh-CN/docs/dev/getting-started/what-is-apache-doris' |
| run 'random EN 404 -> /404.html' '/totally/missing/path' 404 'GENERIC_404' |
| run 'random zh-CN 404 -> /zh-CN/404.html' '/zh-CN/totally/missing/path' 404 'ZH_404' |
| run '/docs/devops bystander -> not rewritten (404)' '/docs/devops' 404 'GENERIC_404' |
| echo 'all assertions passed' |
| ;; |
| *) |
| echo "usage: bash $0 start|test" |
| exit 2 |
| ;; |
| esac |