First switch-on with a running node: Apache mod_dir turns / into /index.html via the DirectoryIndex subrequest before the per-dir root rule can proxy it; the node then asked for /_json/index.html and rendered a cacheable 404 homepage. New flag-gated rule proxies index.html as / to the node. Companion fix outside git: public/_frontend/.htaccess (build output, gitignored) overrides the root rewrites for /_frontend/*, so release assets only existing on the VPS were answered by its SPA fallback with index.html - HTML served as JS; the flag-gated asset proxy now also sits in that file before the fallback, and the frontend build must adopt it in its .htaccess template (ticket 0059-BE). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
36 lines
1.5 KiB
ApacheConf
36 lines
1.5 KiB
ApacheConf
RewriteEngine On
|
|
RewriteBase /_frontend/
|
|
|
|
RewriteRule ^index\.html$ - [L]
|
|
|
|
# SSR flag ON: hashed assets are served from the VPS release - its hashes
|
|
# must win over any local build, and the fallback below must never answer
|
|
# an asset request with index.html (the browser would get HTML as JS).
|
|
# This directory's .htaccess overrides the root one for /_frontend/*, so
|
|
# the rule has to live HERE, not in public/.htaccess (2026-11-09).
|
|
RewriteCond /usr/www/users/vitecevo/live/var/vitec-ssr-on.flag -f
|
|
RewriteRule ^assets/(.*)$ https://vitec-ssr.evomedien.de/_frontend/assets/$1 [P,L]
|
|
|
|
RewriteCond %{REQUEST_FILENAME} -f [OR]
|
|
RewriteCond %{REQUEST_FILENAME} -d
|
|
RewriteRule ^ - [L]
|
|
|
|
RewriteRule ^ index.html [L]
|
|
|
|
# ── Cache headers ────────────────────────────────────────────────────────────
|
|
|
|
# index.html: never cache — always fetch fresh so the browser picks up
|
|
# the latest hashed JS/CSS filenames after a deploy.
|
|
<Files "index.html">
|
|
Header set Cache-Control "no-store, no-cache, must-revalidate"
|
|
Header set Pragma "no-cache"
|
|
Header set Expires "0"
|
|
</Files>
|
|
|
|
# Hashed assets (JS, CSS, fonts, images inside /assets/):
|
|
# Vite appends a content hash to every filename, so these are immutable.
|
|
# Cache them for 1 year — a new deploy produces new filenames automatically.
|
|
<FilesMatch "\.(js|css|woff2?|ttf|eot|otf)$">
|
|
Header set Cache-Control "public, max-age=31536000, immutable"
|
|
</FilesMatch>
|