Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/danitocsc/transporte-unrc-web-public/llms.txt

Use this file to discover all available pages before exploring further.

El comportamiento del servidor Next.js de Transporte Tijuana se controla íntegramente desde web/next.config.ts. Este archivo define cuatro aspectos clave: el modo de salida del build, los orígenes permitidos durante el desarrollo, la redirección de la ruta raíz y las cabeceras de seguridad HTTP aplicadas a todos los endpoints. A continuación se documenta cada sección en detalle.

Archivo completo

import type { NextConfig } from "next";

const nextConfig: NextConfig = {
  output: "standalone",
  allowedDevOrigins: [
    "localhost:3000",
    "127.0.0.1:3000",
    "100.81.77.128:3000",
    "192.168.100.7:3000",
    "100.81.77.128",
    "192.168.100.7"
  ],

  async redirects() {
    return [
      { source: "/", destination: "/mapa-demanda", permanent: false },
    ];
  },

  async headers() {
    return [
      {
        source: "/(.*)",
        headers: [
          { key: "X-Frame-Options", value: "DENY" },
          { key: "X-Content-Type-Options", value: "nosniff" },
          { key: "Referrer-Policy", value: "strict-origin-when-cross-origin" },
          { key: "Permissions-Policy", value: "geolocation=(self)" },
        ],
      },
    ];
  },
};

export default nextConfig;

output: 'standalone'

output: "standalone",
Esta opción le indica al compilador de Next.js que genere un directorio .next/standalone con todo lo necesario para ejecutar el servidor en producción:
  • Un archivo server.js que arranca el servidor HTTP de Node.js directamente (sin necesitar next start ni el paquete next instalado en el entorno final)
  • Todas las dependencias de node_modules requeridas en tiempo de ejecución, copiadas y resueltas
  • Sin código de desarrollo, utilidades de build ni fuentes TypeScript
Este modo es el que hace posible el Dockerfile multi-stage: el stage runner simplemente copia .next/standalone, .next/static y public/ — sin ejecutar npm install — resultando en una imagen final considerablemente más pequeña.
En producción con Vercel, esta opción no tiene efecto negativo: Vercel la respeta pero utiliza su propia infraestructura serverless para servir las páginas, ignorando el server.js generado.

allowedDevOrigins

allowedDevOrigins: [
  "localhost:3000",
  "127.0.0.1:3000",
  "100.81.77.128:3000",
  "192.168.100.7:3000",
  "100.81.77.128",
  "192.168.100.7"
],
Esta lista le indica a Next.js qué orígenes adicionales puede aceptar durante el servidor de desarrollo (next dev). Los orígenes configurados son:
OrigenDescripción
localhost:3000Acceso local estándar desde el mismo equipo
127.0.0.1:3000Dirección de loopback IPv4 explícita
100.81.77.128:3000Acceso desde la red Tailscale del desarrollador
192.168.100.7:3000Acceso desde la LAN local del desarrollador
100.81.77.128Mismo nodo Tailscale sin puerto explícito
192.168.100.7Mismo nodo LAN sin puerto explícito
Esta configuración solo afecta al servidor de desarrollo. En producción (Vercel o Docker con NODE_ENV=production) esta lista no tiene ningún efecto y no amplía la superficie de ataque.

Redirects

async redirects() {
  return [
    { source: "/", destination: "/mapa-demanda", permanent: false },
  ];
},
La única redirección configurada envía a los visitantes de la raíz del sitio (/) a la página principal de contenido (/mapa-demanda). Se usa permanent: false (HTTP 302) en lugar de una redirección permanente (HTTP 301) para que los navegadores y proxies no cacheen el destino de forma indefinida, lo que facilita cambiar la ruta de destino en el futuro sin problemas de caché.

Rutas disponibles

RutaDescripción
/Redirige a /mapa-demanda
/mapa-demandaMapa público e interactivo de paradas y rutas
/informeReporte completo de la demanda y propuesta de movilidad
/api/healthHealthcheck del servidor

Cabeceras de seguridad

async headers() {
  return [
    {
      source: "/(.*)",
      headers: [
        { key: "X-Frame-Options", value: "DENY" },
        { key: "X-Content-Type-Options", value: "nosniff" },
        { key: "Referrer-Policy", value: "strict-origin-when-cross-origin" },
        { key: "Permissions-Policy", value: "geolocation=(self)" },
      ],
    },
  ];
},
El patrón source: "/(.*)" hace que las cabeceras se apliquen a absolutamente todas las rutas del sitio, incluidas las rutas de API. Las cuatro cabeceras configuradas son:
CabeceraValorPropósito
X-Frame-OptionsDENYImpide que la página sea embebida en un <iframe> desde cualquier origen, previniendo ataques de clickjacking
X-Content-Type-OptionsnosniffProhíbe que el navegador intente inferir el tipo MIME de una respuesta ignorando el Content-Type declarado
Referrer-Policystrict-origin-when-cross-originEnvía la URL completa como referrer en peticiones al mismo origen, pero solo el origen (sin path ni query) en peticiones cross-origin; no envía nada en peticiones de HTTPS a HTTP
Permissions-Policygeolocation=(self)Restringe el acceso a la API de Geolocalización del navegador únicamente al propio origen del sitio, bloqueándola en iframes de terceros
Si en el futuro se integra un iframe de terceros (por ejemplo, un mapa embebido externo), será necesario ajustar X-Frame-Options o agregar una directiva Content-Security-Policy: frame-ancestors para permitir el contexto específico requerido.

Build docs developers (and LLMs) love