Content Security Policy (CSP)

Om din sajt använder CSP behöver du tillåta Besökskollen-scriptet.

Vad är CSP?

Content Security Policy är en säkerhetsfunktion som begränsar vilka scripts som får köras på din sajt. Om du ser fel som "Refused to load the script" i webbläsarens konsol beror det troligen på CSP.

CORB vs CSP

Det är viktigt att skilja mellan CSP (Content Security Policy) och CORB (Cross-Origin Read Blocking):

CSP-fel

Meddelande: Refused to load the script

Lösning: Lägg till besokskollen.se i din CSP (se nedan)

CORB-fel

Meddelande: blocked by CORB

Lösning: Detta är ett annat problem - kontakta oss

Tips: CORB är webbläsarens skydd mot cross-origin-svar och kräver korrekta CORS-headers från vår server. Om du ser detta fel, kontakta oss så hjälper vi dig.

Uppdatera din CSP

Lägg till besokskollen.se i din script-src-direktiv:

Content-Security-Policy: script-src 'self' https://besokskollen.se;

Fullständigt exempel

Här är ett exempel på en CSP-header som tillåter Besökskollen:

Content-Security-Policy: default-src 'self'; script-src 'self' https://besokskollen.se; script-src-elem 'self' https://besokskollen.se; connect-src 'self' https://besokskollen.se;

Direktiv som behövs

DirektivVärdeSyfte
script-srchttps://besokskollen.seTillåter laddning av scriptet
script-src-elemhttps://besokskollen.seTillåter externa script-taggar
connect-srchttps://besokskollen.seTillåter API-anrop (tracking-data)

Viktigt om prioritet

CSP-headers kan sättas på flera ställen. Den som "vinner" beror på din serverkonfiguration:

KällaPrioritet
Nginx/Apache configHögst
.htaccessHög
PHP header()Lägre
<meta>-tagLägst

Tips: Om scriptet fortfarande blockeras trots att du lagt till domänen i PHP, kolla om CSP sätts via .htaccess - den kan överskriva PHP-headers.

Meta-tag alternativ

Om du inte kan ändra HTTP-headers kan du använda en meta-tag i <head>:

<meta http-equiv="Content-Security-Policy"
  content="default-src 'self'; script-src 'self' https://besokskollen.se; script-src-elem 'self' https://besokskollen.se; connect-src 'self' https://besokskollen.se;">

Next.js

I Next.js kan du konfigurera CSP i next.config.js:

// next.config.js
const securityHeaders = [
  {
    key: 'Content-Security-Policy',
    value: "default-src 'self'; script-src 'self' https://besokskollen.se; script-src-elem 'self' https://besokskollen.se; connect-src 'self' https://besokskollen.se;"
  }
];

module.exports = {
  async headers() {
    return [
      {
        source: '/:path*',
        headers: securityHeaders,
      },
    ];
  },
};

Vercel

På Vercel kan du lägga till headers i vercel.json:

{
  "headers": [
    {
      "source": "/(.*)",
      "headers": [
        {
          "key": "Content-Security-Policy",
          "value": "default-src 'self'; script-src 'self' https://besokskollen.se; script-src-elem 'self' https://besokskollen.se; connect-src 'self' https://besokskollen.se;"
        }
      ]
    }
  ]
}

Next.js på Vercel (rekommenderat)

Rekommendation: Om du kör Next.js på Vercel, använd vercel.json istället för next.config.js för att säkerställa att headers alltid skickas korrekt.

Här är ett komplett exempel som kombinerar tracking-scriptet med CSP-headers i vercel.json:

{
  "headers": [
    {
      "source": "/(.*)",
      "headers": [
        {
          "key": "Content-Security-Policy",
          "value": "default-src 'self'; script-src 'self' https://besokskollen.se; script-src-elem 'self' https://besokskollen.se; connect-src 'self' https://besokskollen.se;"
        }
      ]
    }
  ]
}

Lägg sedan till tracking-scriptet i din app/layout.tsx:

// app/layout.tsx
import Script from 'next/script'

export default function RootLayout({ children }) {
  return (
    <html lang="sv">
      <head>
        <Script
          defer
          data-site-id="DIN-SAJT-ID"
          data-api="https://besokskollen.se"
          src="https://besokskollen.se/script.js"
          strategy="afterInteractive"
        />
      </head>
      <body>{children}</body>
    </html>
  )
}

Apache / .htaccess

Om du sätter CSP via .htaccess (vanligt på Apache-servrar) kommer denna att överskriva eventuella PHP-headers.

Lägg till https://besokskollen.se i din .htaccess:

<IfModule mod_headers.c>
    Header set Content-Security-Policy "\
default-src 'self'; \
script-src 'self' https://besokskollen.se; \
script-src-elem 'self' https://besokskollen.se; \
connect-src 'self' https://besokskollen.se;"
</IfModule>

Obs: Om du har CSP i både PHP och .htaccess, ta bort CSP-headern från PHP (den ignoreras ändå) och uppdatera istället .htaccess.

Felsökning

Så här hittar du vilken CSP-header som faktiskt skickas:

  1. Öppna DevTools (F12) → Network
  2. Ladda om sidan
  3. Klicka på HTML-dokumentet (första request)
  4. Under Response Headers, leta efter Content-Security-Policy
  5. Verifiera att besokskollen.se finns i script-src, script-src-elem och connect-src

Console vs Issues-panelen

CSP-fel kan dyka upp på olika ställen i DevTools:

Console-fliken

Visar direkta fel när scriptet blockeras. Leta efter röda meddelanden som börjar med Refused to

Issues-panelen

Visar detaljerade CSP-varningar med specifik information om vilka direktiv som blockerar. Öppna via F12 → More tools → Issues

Verifiera att headers skickas

Om du har lagt till CSP men det fortfarande inte fungerar, verifiera att headern faktiskt skickas:

  1. Öppna DevTools (F12) → Network
  2. Markera Disable cache (viktigt!)
  3. Ladda om sidan (Ctrl+Shift+R)
  4. Klicka på HTML-dokumentet och leta efter Content-Security-Policy under Response Headers
  5. Om headern saknas: Kontrollera din server-konfiguration
  6. Om headern finns men besokskollen.se saknas: Uppdatera CSP-värdet

Vanliga fel

  • script-src-elem saknas - Lägg till detta direktiv utöver script-src
  • PHP-ändringar hjälper inte - Kolla om .htaccess överskriver headers
  • Fel domän - Se till att det står exakt https://besokskollen.se