SPB Git

spb/autoscholar

Public
1.6 KB · 49 lines typescript
1import type { NextConfig } from "next";23const isProd = process.env.NODE_ENV === "production";4const staging = process.env.STAGING_MODE === "1";56const securityHeaders = [7  { key: "X-Content-Type-Options", value: "nosniff" },8  { key: "X-Frame-Options", value: "SAMEORIGIN" },9  { key: "Referrer-Policy", value: "strict-origin-when-cross-origin" },10  { key: "Permissions-Policy", value: "camera=(), microphone=(), geolocation=(), browsing-topics=()" },11  {12    key: "Content-Security-Policy",13    value: [14      "default-src 'self'",15      `script-src 'self'${isProd ? "" : " 'unsafe-eval'"} 'unsafe-inline'`,16      "style-src 'self' 'unsafe-inline'",17      "img-src 'self' data: blob:",18      "font-src 'self' data:",19      "connect-src 'self'",20      "frame-src 'self' blob:",21      "object-src 'self'",22      "base-uri 'self'",23      "form-action 'self'",24      "frame-ancestors 'self'",25      ...(isProd ? ["upgrade-insecure-requests"] : []),26    ].join("; "),27  },28  ...(isProd ? [{ key: "Strict-Transport-Security", value: "max-age=31536000; includeSubDomains" }] : []),29  ...(staging ? [{ key: "X-Robots-Tag", value: "noindex, nofollow" }] : []),30];3132const nextConfig: NextConfig = {33  reactStrictMode: true,34  poweredByHeader: false,35  serverExternalPackages: ["pg", "pino", "@node-rs/argon2", "pdfjs-dist", "pdf-lib", "drizzle-orm"],36  experimental: { serverActions: { bodySizeLimit: "2mb" } },37  async headers() {38    return [39      { source: "/(.*)", headers: securityHeaders },40      {41        source: "/papers/:path*",42        headers: [{ key: "Cache-Control", value: "public, max-age=31536000, immutable" }],43      },44    ];45  },46};4748export default nextConfig;49
Files · e709d44366a0d3dc4c8b6b32ba43ac31859be02a
Menu

Theme