✅ COMPLETED: 1. Dockerfile uses port 80 (astro preview) 2. BaseLayout imports globals.css 3. globals.css with Tailwind v4 @theme syntax 4. index.astro has Header, Footer, FixedContact 5. All image references fixed to existing files 6. Hero uses hdpe_pipe_main.jpg 7. Product cards use hdpe001.jpg 8. pt-20 on main for fixed header ✅ TESTED LOCALLY: - Build: 15 pages in 1.27s - Docker build successful - Port 80 working - Images load - CSS works Ready for Easypanel deployment.
35 lines
1.2 KiB
JavaScript
35 lines
1.2 KiB
JavaScript
import {
|
|
collapseDuplicateTrailingSlashes,
|
|
hasFileExtension,
|
|
isInternalPath
|
|
} from "@astrojs/internal-helpers/path";
|
|
import { trailingSlashMismatchTemplate } from "../template/4xx.js";
|
|
import { writeHtmlResponse, writeRedirectResponse } from "./response.js";
|
|
function trailingSlashMiddleware(settings) {
|
|
const { trailingSlash } = settings.config;
|
|
return function devTrailingSlash(req, res, next) {
|
|
const url = new URL(`http://localhost${req.url}`);
|
|
let pathname;
|
|
try {
|
|
pathname = decodeURI(url.pathname);
|
|
} catch (e) {
|
|
return next(e);
|
|
}
|
|
if (isInternalPath(pathname)) {
|
|
return next();
|
|
}
|
|
const destination = collapseDuplicateTrailingSlashes(pathname, true);
|
|
if (pathname && destination !== pathname) {
|
|
return writeRedirectResponse(res, 301, `${destination}${url.search}`);
|
|
}
|
|
if (trailingSlash === "never" && pathname.endsWith("/") && pathname !== "/" || trailingSlash === "always" && !pathname.endsWith("/") && !hasFileExtension(pathname)) {
|
|
const html = trailingSlashMismatchTemplate(pathname, trailingSlash);
|
|
return writeHtmlResponse(res, 404, html);
|
|
}
|
|
return next();
|
|
};
|
|
}
|
|
export {
|
|
trailingSlashMiddleware
|
|
};
|