···3232}
33333434/**
3535- * Determine if a file should be gzip compressed based on its MIME type
3535+ * Determine if a file should be gzip compressed based on its MIME type and filename
3636 */
3737-export function shouldCompressFile(mimeType: string): boolean {
3737+export function shouldCompressFile(mimeType: string, fileName?: string): boolean {
3838+ // Never compress _redirects file - it needs to be plain text for the hosting service
3939+ if (fileName && (fileName.endsWith('/_redirects') || fileName === '_redirects')) {
4040+ return false;
4141+ }
4242+3843 // Compress text-based files and uncompressed audio formats
3944 const compressibleTypes = [
4045 'text/html',
+2-2
src/routes/wisp.ts
···191191 const originalContent = Buffer.from(arrayBuffer);
192192 const originalMimeType = file.type || 'application/octet-stream';
193193194194- // Determine if file should be compressed
195195- const shouldCompress = shouldCompressFile(originalMimeType);
194194+ // Determine if file should be compressed (pass filename to exclude _redirects)
195195+ const shouldCompress = shouldCompressFile(originalMimeType, normalizedPath);
196196197197 // Text files (HTML/CSS/JS) need base64 encoding to prevent PDS content sniffing
198198 // Audio files just need compression without base64