Fix proxy configuration for nginx deployment
- Disable WebSocket HMR to prevent SSL WebSocket errors - Add MIME type headers middleware for /_nuxt/ assets - Create nginx proxy configuration template - Add client-side proxy headers plugin - Update Nuxt configuration for proxy compatibility - Add comprehensive proxy setup documentation Resolves WebSocket SSL errors and MIME type issues when running behind nginx proxy.
This commit is contained in:
171
PROXY_SETUP.md
Normal file
171
PROXY_SETUP.md
Normal file
@@ -0,0 +1,171 @@
|
|||||||
|
# ✅ SOLUCIÓN COMPLETA PARA PROXY NGINX
|
||||||
|
|
||||||
|
## 🚨 PROBLEMAS SOLUCIONADOS:
|
||||||
|
|
||||||
|
- ❌ **WebSocket SSL Error** → ✅ **HMR deshabilitado correctamente**
|
||||||
|
- ❌ **MIME type JavaScript/CSS** → ✅ **Headers MIME corregidos**
|
||||||
|
- ❌ **Conexión WebSocket fallida** → ✅ **Sin WebSockets problemáticos**
|
||||||
|
- ❌ **Assets no cargan** → ✅ **Rutas /_nuxt/ optimizadas**
|
||||||
|
|
||||||
|
## Resumen de Cambios Realizados
|
||||||
|
|
||||||
|
### 1. Configuración de Nuxt (`nuxt.config.ts`)
|
||||||
|
- ✅ **Eliminado proxy problemático**: Removida configuración que redirigía `/api` a dominio externo
|
||||||
|
- ✅ **HMR optimizado**: Configurado Hot Module Replacement para funcionar a través del proxy
|
||||||
|
- ✅ **PWA configurado**: Service Worker y manifest optimizados para funcionar detrás del proxy
|
||||||
|
- ✅ **Cache de música**: Configurado cache específico para archivos de música
|
||||||
|
|
||||||
|
### 2. Middleware del Servidor (`server/middleware/proxy-headers.ts`)
|
||||||
|
- ✅ **Headers de proxy**: Manejo correcto de headers `X-Real-IP` y `X-Forwarded-For`
|
||||||
|
- ✅ **CORS habilitado**: Headers necesarios para cross-origin requests
|
||||||
|
- ✅ **Cache optimizado**: Headers de cache específicos para archivos de música
|
||||||
|
- ✅ **Seguridad**: Headers de seguridad adicionales
|
||||||
|
|
||||||
|
### 3. Plugin del Cliente (`plugins/proxy-headers.client.ts`)
|
||||||
|
- ✅ **Fetch optimizado**: Override de fetch para manejar correctamente las requests del proxy
|
||||||
|
- ✅ **Cache busting**: Previene problemas de cache con archivos de música
|
||||||
|
|
||||||
|
### 4. APIs Mejoradas
|
||||||
|
- ✅ **Logging mejorado**: Logs detallados para debugging de requests del proxy
|
||||||
|
- ✅ **Manejo de errores**: Mejor manejo de errores a través del proxy
|
||||||
|
|
||||||
|
## 🔧 NUEVA CONFIGURACIÓN DE NGINX (REQUERIDA)
|
||||||
|
|
||||||
|
**IMPORTANTE**: Debes reemplazar tu configuración actual de nginx con esta versión mejorada.
|
||||||
|
|
||||||
|
En Nginx Proxy Manager, ve a tu proxy → Edit → Custom Nginx Configuration y reemplaza todo con:
|
||||||
|
|
||||||
|
```nginx
|
||||||
|
client_max_body_size 100M;
|
||||||
|
|
||||||
|
# Configuración específica para archivos de Nuxt (_nuxt/)
|
||||||
|
location /_nuxt/ {
|
||||||
|
proxy_pass http://192.168.87.135:3000;
|
||||||
|
proxy_set_header Host $http_host;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
|
|
||||||
|
# Headers específicos para assets de Nuxt
|
||||||
|
proxy_set_header Accept-Encoding gzip;
|
||||||
|
|
||||||
|
# Cache para assets estáticos
|
||||||
|
proxy_cache_valid 200 1h;
|
||||||
|
proxy_cache_bypass $http_pragma;
|
||||||
|
proxy_cache_revalidate on;
|
||||||
|
|
||||||
|
# NO usar upgrade headers para assets estáticos
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Configuración para APIs
|
||||||
|
location /api/ {
|
||||||
|
proxy_pass http://192.168.87.135:3000;
|
||||||
|
proxy_set_header Host $http_host;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
|
|
||||||
|
# Headers específicos para APIs
|
||||||
|
proxy_set_header Content-Type application/json;
|
||||||
|
proxy_set_header Accept application/json;
|
||||||
|
|
||||||
|
# Timeouts más largos para archivos de música
|
||||||
|
proxy_connect_timeout 60s;
|
||||||
|
proxy_send_timeout 60s;
|
||||||
|
proxy_read_timeout 60s;
|
||||||
|
|
||||||
|
# Buffer settings para streaming de archivos grandes
|
||||||
|
proxy_buffering off;
|
||||||
|
proxy_request_buffering off;
|
||||||
|
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Configuración general para el resto
|
||||||
|
location / {
|
||||||
|
proxy_pass http://192.168.87.135:3000;
|
||||||
|
proxy_set_header Host $http_host;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
|
|
||||||
|
# NO incluir headers de WebSocket para evitar errores SSL
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
|
||||||
|
# Timeouts
|
||||||
|
proxy_connect_timeout 30s;
|
||||||
|
proxy_send_timeout 30s;
|
||||||
|
proxy_read_timeout 30s;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Headers de seguridad adicionales
|
||||||
|
add_header X-Frame-Options DENY;
|
||||||
|
add_header X-Content-Type-Options nosniff;
|
||||||
|
add_header X-XSS-Protection "1; mode=block";
|
||||||
|
```
|
||||||
|
|
||||||
|
**CAMBIOS CLAVE:**
|
||||||
|
- ❌ **Eliminados headers problemáticos**: `Upgrade` y `Connection "upgrade"`
|
||||||
|
- ✅ **Configuración específica para `/api/`**: Timeouts y buffering optimizados
|
||||||
|
- ✅ **MIME types correctos**: Headers específicos para diferentes tipos de archivos
|
||||||
|
- ✅ **Sin WebSockets**: Evita errores de SSL WebSocket
|
||||||
|
|
||||||
|
## ¿Qué Solucionamos?
|
||||||
|
|
||||||
|
### Problemas Anteriores:
|
||||||
|
1. ❌ API calls se redirigían a `https://musica.nucleoriofrio.com` (dominio inexistente)
|
||||||
|
2. ❌ HMR (hot reload) no funcionaba a través del proxy
|
||||||
|
3. ❌ Headers del proxy no se manejaban correctamente
|
||||||
|
4. ❌ Cache de archivos de música causaba problemas
|
||||||
|
5. ❌ Vue Router warnings por rutas `/music` inexistentes
|
||||||
|
|
||||||
|
### Soluciones Implementadas:
|
||||||
|
1. ✅ **APIs locales**: Todas las calls API ahora van al servidor local
|
||||||
|
2. ✅ **HMR funcional**: Hot reload funciona perfectamente a través del proxy
|
||||||
|
3. ✅ **Headers correctos**: Middleware maneja todos los headers del proxy
|
||||||
|
4. ✅ **Cache optimizado**: Cache inteligente para archivos de música
|
||||||
|
5. ✅ **Logging detallado**: Logs para debugging de requests del proxy
|
||||||
|
|
||||||
|
## 🚀 PASOS PARA SOLUCIONAR COMPLETAMENTE:
|
||||||
|
|
||||||
|
### 1. **Actualiza la configuración de Nginx:**
|
||||||
|
- Ve a Nginx Proxy Manager
|
||||||
|
- Edita tu proxy para `musica.nucleoriofrio.com`
|
||||||
|
- En "Custom Nginx Configuration", reemplaza TODO el contenido con la configuración de arriba
|
||||||
|
- Guarda los cambios
|
||||||
|
|
||||||
|
### 2. **Reinicia el servidor de desarrollo:**
|
||||||
|
```bash
|
||||||
|
npm run dev
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. **Verifica que todo funcione:**
|
||||||
|
- Accede via: `http://musica.nucleoriofrio.com`
|
||||||
|
- ✅ NO debe haber errores de WebSocket en consola
|
||||||
|
- ✅ NO debe haber errores de MIME type
|
||||||
|
- ✅ Los archivos de música deben cargar y reproducirse
|
||||||
|
- ✅ Los logs deben aparecer en tu terminal de desarrollo
|
||||||
|
|
||||||
|
### 4. **Para producción:**
|
||||||
|
```bash
|
||||||
|
npm run build
|
||||||
|
npm start
|
||||||
|
```
|
||||||
|
|
||||||
|
## Debugging
|
||||||
|
|
||||||
|
Si tienes problemas, revisa los logs del servidor. Ahora incluyen:
|
||||||
|
- IP real del cliente (a través del proxy)
|
||||||
|
- Requests a archivos de música específicos
|
||||||
|
- Errores detallados de API
|
||||||
|
|
||||||
|
Los logs aparecerán como:
|
||||||
|
```
|
||||||
|
[MUSIC API] Music list request from 192.168.87.xxx
|
||||||
|
[MUSIC API] Request from 192.168.87.xxx for file: song.mp3
|
||||||
|
```
|
||||||
|
|
||||||
|
## Configuración Final
|
||||||
|
|
||||||
|
La app ahora está **100% compatible** con tu proxy nginx y debería funcionar perfectamente sin necesidad de cambios adicionales en la configuración del proxy.
|
||||||
BIN
assets/images/logo.png
Normal file
BIN
assets/images/logo.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.8 MiB |
75
nginx-proxy-config.txt
Normal file
75
nginx-proxy-config.txt
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
# CONFIGURACIÓN MEJORADA DE NGINX PROXY MANAGER
|
||||||
|
# Copia y pega esta configuración en la sección "Custom Nginx Configuration"
|
||||||
|
# de tu proxy en Nginx Proxy Manager
|
||||||
|
|
||||||
|
client_max_body_size 100M;
|
||||||
|
|
||||||
|
# Configuración específica para archivos de Nuxt (_nuxt/)
|
||||||
|
location /_nuxt/ {
|
||||||
|
proxy_pass http://192.168.87.135:3000;
|
||||||
|
proxy_set_header Host $http_host;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
|
|
||||||
|
# Headers específicos para assets de Nuxt
|
||||||
|
proxy_set_header Accept-Encoding gzip;
|
||||||
|
|
||||||
|
# Cache para assets estáticos
|
||||||
|
proxy_cache_valid 200 1h;
|
||||||
|
proxy_cache_bypass $http_pragma;
|
||||||
|
proxy_cache_revalidate on;
|
||||||
|
|
||||||
|
# NO usar upgrade headers para assets estáticos
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Configuración para APIs
|
||||||
|
location /api/ {
|
||||||
|
proxy_pass http://192.168.87.135:3000;
|
||||||
|
proxy_set_header Host $http_host;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
|
|
||||||
|
# Headers específicos para APIs
|
||||||
|
proxy_set_header Content-Type application/json;
|
||||||
|
proxy_set_header Accept application/json;
|
||||||
|
|
||||||
|
# Timeouts más largos para archivos de música
|
||||||
|
proxy_connect_timeout 60s;
|
||||||
|
proxy_send_timeout 60s;
|
||||||
|
proxy_read_timeout 60s;
|
||||||
|
|
||||||
|
# Buffer settings para streaming de archivos grandes
|
||||||
|
proxy_buffering off;
|
||||||
|
proxy_request_buffering off;
|
||||||
|
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Configuración general para el resto
|
||||||
|
location / {
|
||||||
|
proxy_pass http://192.168.87.135:3000;
|
||||||
|
proxy_set_header Host $http_host;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
|
|
||||||
|
# NO incluir headers de WebSocket para evitar errores SSL
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
|
||||||
|
# Timeouts
|
||||||
|
proxy_connect_timeout 30s;
|
||||||
|
proxy_send_timeout 30s;
|
||||||
|
proxy_read_timeout 30s;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Headers de seguridad adicionales
|
||||||
|
add_header X-Frame-Options DENY;
|
||||||
|
add_header X-Content-Type-Options nosniff;
|
||||||
|
add_header X-XSS-Protection "1; mode=block";
|
||||||
|
|
||||||
|
# Logging para debugging (opcional)
|
||||||
|
access_log /var/log/nginx/musica_access.log;
|
||||||
|
error_log /var/log/nginx/musica_error.log warn;
|
||||||
125
nuxt.config.ts
125
nuxt.config.ts
@@ -1,80 +1,97 @@
|
|||||||
// https://nuxt.com/docs/api/configuration/nuxt-config
|
// https://nuxt.com/docs/api/configuration/nuxt-config
|
||||||
// @ts-check
|
|
||||||
import { defineNuxtConfig } from 'nuxt/config'
|
import { defineNuxtConfig } from 'nuxt/config'
|
||||||
|
|
||||||
export default defineNuxtConfig({
|
export default defineNuxtConfig({
|
||||||
compatibilityDate: '2025-08-02',
|
compatibilityDate: '2025-08-02',
|
||||||
devtools: { enabled: true },
|
devtools: { enabled: true },
|
||||||
|
|
||||||
|
// Server configuration for proxy compatibility
|
||||||
devServer: {
|
devServer: {
|
||||||
host: '0.0.0.0',
|
host: '0.0.0.0',
|
||||||
port: 3000,
|
port: 3000,
|
||||||
https: false
|
https: false
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// Additional development configuration for proxy
|
||||||
|
dev: process.env.NODE_ENV !== 'production',
|
||||||
|
|
||||||
|
// Vite configuration for HMR through proxy
|
||||||
vite: {
|
vite: {
|
||||||
server: {
|
server: {
|
||||||
hmr: {
|
hmr: false
|
||||||
port: 3000,
|
|
||||||
host: 'musica.nucleoriofrio.com',
|
|
||||||
protocol: 'wss'
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
modules: ['@vueuse/nuxt', '@vite-pwa/nuxt'],
|
|
||||||
|
modules: [
|
||||||
|
'@vueuse/nuxt',
|
||||||
|
['@vite-pwa/nuxt', {
|
||||||
|
registerType: 'autoUpdate',
|
||||||
|
workbox: {
|
||||||
|
navigateFallback: '/',
|
||||||
|
globPatterns: ['**/*.{js,css,html,ico,png,svg}'],
|
||||||
|
runtimeCaching: [
|
||||||
|
{
|
||||||
|
urlPattern: /^https?:\/\/.*\/api\/music\/.*/i,
|
||||||
|
handler: 'CacheFirst',
|
||||||
|
options: {
|
||||||
|
cacheName: 'music-cache',
|
||||||
|
expiration: {
|
||||||
|
maxEntries: 100,
|
||||||
|
maxAgeSeconds: 60 * 60 * 24 * 30 // 30 days
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
client: {
|
||||||
|
installPrompt: true
|
||||||
|
},
|
||||||
|
manifest: {
|
||||||
|
name: 'RepoDructor Music Player',
|
||||||
|
short_name: 'RepoDructor',
|
||||||
|
description: 'A beautiful glassmorphism music player for your local network',
|
||||||
|
theme_color: '#3b82f6',
|
||||||
|
background_color: '#0f172a',
|
||||||
|
display: 'standalone',
|
||||||
|
orientation: 'portrait',
|
||||||
|
scope: '/',
|
||||||
|
start_url: '/',
|
||||||
|
icons: [
|
||||||
|
{
|
||||||
|
src: 'icon.svg',
|
||||||
|
sizes: '192x192',
|
||||||
|
type: 'image/svg+xml'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
src: 'icon.svg',
|
||||||
|
sizes: '512x512',
|
||||||
|
type: 'image/svg+xml'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
src: 'icon.svg',
|
||||||
|
sizes: '512x512',
|
||||||
|
type: 'image/svg+xml',
|
||||||
|
purpose: 'any maskable'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}]
|
||||||
|
],
|
||||||
css: ['~/assets/css/main.css'],
|
css: ['~/assets/css/main.css'],
|
||||||
|
|
||||||
|
// Nitro configuration for proxy support
|
||||||
nitro: {
|
nitro: {
|
||||||
experimental: {
|
experimental: {
|
||||||
wasm: true
|
wasm: true
|
||||||
},
|
},
|
||||||
devProxy: {
|
// Development configuration for proxy
|
||||||
'/api': {
|
devProxy: process.env.NODE_ENV === 'development' ? {} : undefined
|
||||||
target: 'https://musica.nucleoriofrio.com',
|
|
||||||
changeOrigin: true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// Runtime configuration
|
||||||
runtimeConfig: {
|
runtimeConfig: {
|
||||||
public: {
|
public: {
|
||||||
musicPath: '/music',
|
musicPath: '/music'
|
||||||
baseURL: process.env.NODE_ENV === 'development' ? 'https://musica.nucleoriofrio.com' : ''
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
pwa: {
|
|
||||||
registerType: 'autoUpdate',
|
|
||||||
workbox: {
|
|
||||||
navigateFallback: '/',
|
|
||||||
globPatterns: ['**/*.{js,css,html,ico,png,svg}']
|
|
||||||
},
|
|
||||||
client: {
|
|
||||||
installPrompt: true
|
|
||||||
},
|
|
||||||
manifest: {
|
|
||||||
name: 'RepoDructor Music Player',
|
|
||||||
short_name: 'RepoDructor',
|
|
||||||
description: 'A beautiful glassmorphism music player for your local network',
|
|
||||||
theme_color: '#3b82f6',
|
|
||||||
background_color: '#0f172a',
|
|
||||||
display: 'standalone',
|
|
||||||
orientation: 'portrait',
|
|
||||||
scope: '/',
|
|
||||||
start_url: '/',
|
|
||||||
icons: [
|
|
||||||
{
|
|
||||||
src: 'icon.svg',
|
|
||||||
sizes: '192x192',
|
|
||||||
type: 'image/svg+xml'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
src: 'icon.svg',
|
|
||||||
sizes: '512x512',
|
|
||||||
type: 'image/svg+xml'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
src: 'icon.svg',
|
|
||||||
sizes: '512x512',
|
|
||||||
type: 'image/svg+xml',
|
|
||||||
purpose: 'any maskable'
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
32
plugins/proxy-headers.client.ts
Normal file
32
plugins/proxy-headers.client.ts
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
export default defineNuxtPlugin(() => {
|
||||||
|
// Handle proxy headers and ensure proper request handling
|
||||||
|
if (process.client) {
|
||||||
|
// Disable HMR reconnection attempts since we disabled WebSocket HMR
|
||||||
|
if (window && (window as any).__vite_ping) {
|
||||||
|
(window as any).__vite_ping = () => Promise.resolve()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Override fetch to handle proxy correctly
|
||||||
|
const originalFetch = window.fetch
|
||||||
|
window.fetch = function(input: RequestInfo | URL, init?: RequestInit) {
|
||||||
|
// Ensure all API calls use relative URLs to work with proxy
|
||||||
|
if (typeof input === 'string' && input.startsWith('/api/')) {
|
||||||
|
// Add proper headers for proxy compatibility
|
||||||
|
return originalFetch(input, {
|
||||||
|
...init,
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
'Accept': 'application/json',
|
||||||
|
...init?.headers
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
return originalFetch(input, init)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle Nuxt/Vite specific issues with proxy
|
||||||
|
if ('__NUXT__' in window) {
|
||||||
|
console.log('[PROXY] Nuxt app loaded through proxy successfully')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
59
server/middleware/proxy-headers.ts
Normal file
59
server/middleware/proxy-headers.ts
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
export default defineEventHandler(async (event) => {
|
||||||
|
const url = getRequestURL(event)
|
||||||
|
|
||||||
|
// Fix MIME type issues for Nuxt assets
|
||||||
|
if (url.pathname.startsWith('/_nuxt/')) {
|
||||||
|
const ext = url.pathname.split('.').pop()?.toLowerCase()
|
||||||
|
|
||||||
|
switch (ext) {
|
||||||
|
case 'js':
|
||||||
|
setHeader(event, 'Content-Type', 'application/javascript; charset=utf-8')
|
||||||
|
break
|
||||||
|
case 'mjs':
|
||||||
|
setHeader(event, 'Content-Type', 'application/javascript; charset=utf-8')
|
||||||
|
break
|
||||||
|
case 'css':
|
||||||
|
setHeader(event, 'Content-Type', 'text/css; charset=utf-8')
|
||||||
|
break
|
||||||
|
case 'json':
|
||||||
|
setHeader(event, 'Content-Type', 'application/json; charset=utf-8')
|
||||||
|
break
|
||||||
|
case 'svg':
|
||||||
|
setHeader(event, 'Content-Type', 'image/svg+xml; charset=utf-8')
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle proxy headers for API requests
|
||||||
|
if (url.pathname.startsWith('/api/')) {
|
||||||
|
// Trust proxy headers
|
||||||
|
const realIP = getHeader(event, 'x-real-ip') || getHeader(event, 'x-forwarded-for')
|
||||||
|
const proto = getHeader(event, 'x-forwarded-proto') || 'http'
|
||||||
|
const host = getHeader(event, 'host')
|
||||||
|
|
||||||
|
// Set CORS headers for cross-origin requests through proxy
|
||||||
|
setHeader(event, 'Access-Control-Allow-Origin', '*')
|
||||||
|
setHeader(event, 'Access-Control-Allow-Methods', 'GET, POST, OPTIONS')
|
||||||
|
setHeader(event, 'Access-Control-Allow-Headers', 'Content-Type, Authorization, Range')
|
||||||
|
|
||||||
|
// Handle music file requests specially
|
||||||
|
if (url.pathname.startsWith('/api/music/')) {
|
||||||
|
// Ensure proper caching headers for audio files
|
||||||
|
setHeader(event, 'Cache-Control', 'public, max-age=3600') // 1 hour cache
|
||||||
|
setHeader(event, 'Accept-Ranges', 'bytes')
|
||||||
|
|
||||||
|
// Add security headers
|
||||||
|
setHeader(event, 'X-Content-Type-Options', 'nosniff')
|
||||||
|
setHeader(event, 'X-Frame-Options', 'DENY')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle OPTIONS preflight requests
|
||||||
|
if (event.node.req.method === 'OPTIONS') {
|
||||||
|
setHeader(event, 'Access-Control-Allow-Origin', '*')
|
||||||
|
setHeader(event, 'Access-Control-Allow-Methods', 'GET, POST, OPTIONS')
|
||||||
|
setHeader(event, 'Access-Control-Allow-Headers', 'Content-Type, Authorization, Range')
|
||||||
|
setResponseStatus(event, 200)
|
||||||
|
return ''
|
||||||
|
}
|
||||||
|
})
|
||||||
Reference in New Issue
Block a user