···32}
3334/**
35- * Determine if a file should be gzip compressed based on its MIME type
36 */
37-export function shouldCompressFile(mimeType: string): boolean {
0000038 // Compress text-based files and uncompressed audio formats
39 const compressibleTypes = [
40 'text/html',
···32}
3334/**
35+ * Determine if a file should be gzip compressed based on its MIME type and filename
36 */
37+export function shouldCompressFile(mimeType: string, fileName?: string): boolean {
38+ // Never compress _redirects file - it needs to be plain text for the hosting service
39+ if (fileName && (fileName.endsWith('/_redirects') || fileName === '_redirects')) {
40+ return false;
41+ }
42+43 // Compress text-based files and uncompressed audio formats
44 const compressibleTypes = [
45 'text/html',
+2-2
src/routes/wisp.ts
···191 const originalContent = Buffer.from(arrayBuffer);
192 const originalMimeType = file.type || 'application/octet-stream';
193194- // Determine if file should be compressed
195- const shouldCompress = shouldCompressFile(originalMimeType);
196197 // Text files (HTML/CSS/JS) need base64 encoding to prevent PDS content sniffing
198 // Audio files just need compression without base64
···191 const originalContent = Buffer.from(arrayBuffer);
192 const originalMimeType = file.type || 'application/octet-stream';
193194+ // Determine if file should be compressed (pass filename to exclude _redirects)
195+ const shouldCompress = shouldCompressFile(originalMimeType, normalizedPath);
196197 // Text files (HTML/CSS/JS) need base64 encoding to prevent PDS content sniffing
198 // Audio files just need compression without base64