Shopify "Are you sure you want to leave": så slipper du rutan vid externa länkar

Shopify avbryter länkar ut från butiken med "Are you sure you want to leave?" och "This link is taking you to another website". Du kan inte stänga av den. Här är varför den slår på vissa länkar men inte andra, och omdirigeringen som undviker den.

Shopify Teman Felsökning Flera butiker

Runt den 20 oktober 2026 började Shopify avbryta länkar som lämnar butiken. Besökaren får en ruta över hela skärmen:

Shopifys leave store confirmation: en rubrik som frågar om du är säker på att du vill lämna butiken, raden This link is taking you to another website, destinationens domän i fetstil, och två knappar, Go to site och Back to butiken.
Shopifys leave store confirmation: en rubrik som frågar om du är säker på att du vill lämna butiken, raden This link is taking you to another website, destinationens domän i fetstil, och två knappar, Go to site och Back to butiken.

Texten är hårdkodad på engelska och går inte att översätta. Shopify kallar funktionen leave store confirmation, i koden heter den exit_interstitial. Ingen changelog. De flesta handlare upptäckte det när marknadsväljaren slutade fungera.

Help Center är tydlig med vilka alternativ du har:

At this time, you can’t turn off the message or choose websites that skip it.

Ingen inställning, ingen lista över betrodda domäner, ingenting i temat. Driver du en butik på en domän märker du knappt av det. Driver du en butik per marknad sitter den mitt i din landsväljare.

Varför den slår på vissa länkar men inte andra

Skriptet får en konfiguration per butik med en allowedHosts-array. Den innehåller dina domäner från Domains-sidan, dina .myshopify.com- och account-subdomäner, shopify.com, shop.app, och en fast lista med sociala nätverk som är densamma i alla butiker: access.line.me, api.whatsapp.com, facebook.com, instagram.com, lin.ee, pinterest.com, snapchat.com, tiktok.com, twitter.com, vimeo.com, wa.me, x.com, youtu.be, youtube.com.

Matchningen går uppåt i domänträdet:

return (hostname) => {
  let l = hostname;
  while (set[l] !== true) {
    const i = l.indexOf(".");
    if (i === -1) return false;
    l = l.slice(i + 1);   // kapa etiketten längst till vänster, testa igen
  }
  return true;
};

En post för dittmarke.com tillåter alltså varje *.dittmarke.com på köpet. Marknader byggda på subdomäner länkar mestadels till varandra utan rutan. Marknader byggda på landsdomäner träffar den på varje hopp, eftersom ingen kapning av etiketter i dittmarke.se någonsin ger dittmarke.de.

Jag mätte en grupp med 15 marknader som blandar båda. Från subdomänbutiken gick 6 av 15 destinationer igenom och 9 avbröts, och de 6 var alla *.dittmarke.com som täcktes av apex-posten. Från en landsdomänbutik, vars allowedHosts saknar apex-post, avbröts alla 15, även subdomänerna. Samma företag, samma väljare, motsatt beteende, och ingenting i något av temana förklarar det.

Att lägga till systerdomänerna på Domains-sidan löser det inte. En domän kan bara kopplas till en butik.

Varför du inte kan fixa det i temat

Skriptet kopplar på en shadow root med mode: "closed", så ingen stilmall och inget skript av ditt når in. Letar du efter rutan på det uppenbara sättet hittar du ingenting:

document.querySelectorAll('dialog[open]').length        // 0, även medan den syns
!!document.querySelector('shopify-exit-interstitial')   // det här är kontrollen som funkar

Det cachar också inbyggda metoder innan någon temakod kör, så att skriva över window.location, patcha Element.prototype.getAttribute eller byta ut Event.prototype.preventDefault gör ingenting. Det är de tre saker folk testar först.

Det hakar i länkklick, Navigation API, window.open, location.assign och location.replace. Det lämnar bakåt och framåt i fred, hoppar över formulärinskick och struntar i mailto: och tel:.

Omdirigeringen

Kontrollen som avgör om rutan visas är den här:

url.origin !== currentOrigin

URL:er på samma origin granskas aldrig. Peka alltså länken på din egen domän och låt Shopify göra hoppet på serversidan:

  1. Under Innehåll > Menyer > URL-omdirigeringar, lägg till /go/fr till https://dittmarke.fr
  2. Ändra länken från https://dittmarke.fr till /go/fr

En 301 från servern utlöser aldrig något nytt navigate-event, så det finns ingenting kvar att fånga.

$ curl -sS -D - -o /dev/null https://dittmarke.se/go/fr
HTTP/2 301
location: https://dittmarke.fr/

I en riktig Chrome-flik, med det en marknadsväljare kör:

KodURL efteråtAvbruten
location.href = 'https://dittmarke.fr/'oförändradja
location.href = '/go/fr'https://dittmarke.fr/nej

Referrern överlever, så attributionen är intakt. Ingen app, finns på alla planer.

Så behåller du djuplänken

Omdirigeringar för vidare query-strängen men inte extra sökvägssegment:

AnropResultat
/go/fr?x=1301 till https://dittmarke.fr/?x=1
/go/fr/products/foo404

De flesta väljare djuplänkar idag, oftast med någon variant av data-url="{{ redirect_option.redirect_url }}{{ path }}", så byter du marknad från en produktsida blir du kvar på produkten. Ett naket /go/fr släpper av alla på startsidan i stället.

Sökvägen får åka med i query-strängen:

/go/dittmarke-fr?to=/products/foo
  → 301 → https://dittmarke.fr/?to=/products/foo
  → destinationen byter sida på samma origin

I destinationsbutiken, tidigt i head:

const to = new URLSearchParams(location.search).get('to');
// "//evil.com" börjar också med snedstreck, så avvisa det andra eller så har du
// byggt en öppen omdirigering i din egen butik.
if (to && to.startsWith('/') && !to.startsWith('//')) location.replace(to);

Jag testade också undantaget för formData genom att skicka ett GET-formulär till en annan domän. Det avbröts ändå. Den vägen är stängd.

Noteringar från testerna

Skriptet injiceras bara när anropet ser ut som en webbläsarnavigering. En vanlig curl innehåller det inte, och du drar fel slutsats om att din butik är opåverkad. Skicka med Sec-Fetch-Mode: navigate och Sec-Fetch-Dest: document och en vanlig user agent, och greppa sedan efter shopify.exit_interstitial.

Headless-webbläsare bakom sandlåda eller proxy blockerar navigering till andra domäner på egen hand, vilket ser likadant ut. Klicka vidare till en orelaterad domän från samma sida som kontroll. Blockeras även den tyst är det miljön som är problemet och testet säger ingenting.

Brasklapp

Det här är ett skydd mot nätfiske. Det finns för att en kapad butik inte ska kunna skicka kunder till en falsk kassa. Omdirigeringen går runt det.

Det är rimligt för länkar mellan butiker du äger, vilket aldrig var måltavlan, och Shopify kan täppa till det när de vill genom att granska destinationen för omdirigeringar på samma origin. Den riktiga lösningen är en lista över betrodda domäner, vilket är vad handlare ber om i forumen. Använd det för dina egna marknader, inte för tredjepartslänkar.

Allt i det här inlägget är gratis att använda. Vill du hellre att jag tittar på din butik? Boka en genomgång så gör vi det tillsammans.

Hör av dig

Vill du veta vad jag skulle förbättra i din butik?

Skriv några rader om butiken. Jag svarar inom två arbetsdagar.

Hör av dig →