CORS Handbook
The complete guide to understanding and fixing CORS errors.
Built by headertest.com
Make (formerly Integromat) is great at stitching APIs together. The trouble starts when you try to involve a browser. A lot of developers assume this flow will work: frontend app calls API directly Make scenario orchestrates some backend steps browser reads the response and moves on Then CORS shows up and ruins the afternoon. The core problem: Make runs server-to-server just fine, but browsers enforce CORS and Make does not magically bypass that for your frontend. If your app calls an API from the browser, the API still needs the right CORS headers. If your app calls a Make webhook from the browser, that webhook also needs to behave in a browser-friendly way. ...
Capacitor sits in an awkward but very practical place: your app looks like a website, runs in a WebView, but ships like a native app. That hybrid setup changes how CORS behaves, and a lot of advice written for regular websites breaks down fast. If you’ve ever thought: “My API works in Chrome but not in Capacitor” “Why is my app origin capacitor://localhost?” “Why do cookies disappear on mobile?” “Why does native HTTP magically bypass CORS?” You’re in the right place. ...
If you build internal tools with Appsmith, you will hit CORS sooner or later. Usually it happens like this: your API works fine in Postman or curl, then Appsmith tries to call it from the browser and everything blows up with a vague “blocked by CORS policy” error. That is not Appsmith being weird. That is the browser enforcing cross-origin rules exactly as designed. This guide is the copy-paste version I wish more teams had. No fluff, just what matters for Appsmith apps. ...
Telegram bot webhooks and CORS are a weird combo, mostly because people often try to solve the wrong problem. Here’s the blunt version: Telegram does not care about CORS when delivering webhooks to your server. Browsers care about CORS. Telegram is not a browser. So if your bot backend receives webhook requests from Telegram, CORS is irrelevant for that inbound traffic. Where CORS does matter is when you put a browser app in front of your bot infrastructure and that browser tries to call your webhook endpoint, bot API proxy, status endpoint, or admin interface. ...
CORS gets blamed for a lot of things it didn’t do. Half the time the server is fine and the browser is blocking access on purpose. The other half, someone added mode: "no-cors" and made the problem harder to debug. This guide is the practical version: what the browser actually gives you, what “opaque” really means, and how to make cross-origin responses readable. The short version When your frontend calls another origin, the browser decides whether JavaScript can read the response. ...
CORS in Actix-web is one of those things that looks trivial until your frontend starts failing with mysterious preflight errors at 2 AM. Rust gives you strong guarantees around memory safety. CORS gives you sharp edges around browser behavior. Different problem space entirely. If you’re building APIs with Actix-web, you’ll usually end up choosing between a few practical CORS strategies: * for public APIs strict allowlists for browser apps dynamic origin handling for multi-tenant setups “just reflect the origin” hacks you probably shouldn’t ship I’ll compare those approaches, show where Actix-web fits well, and point out the tradeoffs that actually matter in production. ...
Multi-region APIs are great right up until the browser gets involved. Your backend can happily serve traffic from us-east-1, eu-west-1, and ap-southeast-1, but once a frontend starts calling those endpoints cross-origin, CORS becomes one of the easiest ways to break an otherwise solid deployment. I’ve seen teams spend days debugging “random” browser failures that turned out to be region-specific CORS drift. If you run APIs behind a CDN, global load balancer, edge worker, or region-aware gateway, you need to treat CORS as part of your routing architecture, not just a couple of headers added somewhere in Express. ...
ToolJet makes it very easy to wire up APIs, databases, and internal tools fast. Then CORS shows up and ruins your afternoon. If you are building ToolJet apps that call APIs from the browser, CORS is one of those constraints you cannot brute-force away. You either design around it, proxy around it, or configure it correctly on the server. There is no frontend-only hack that “disables CORS” in production. If somebody suggests a browser extension, close the tab. ...
If you deploy APIs on Fly.io, CORS usually stops being “just a browser thing” the moment your frontend hits production. Locally, everything works. Then your app lands behind Fly Proxy, gets a custom domain, maybe a second region, and suddenly your browser starts yelling about preflights and missing Access-Control-Allow-Origin. The good news: Fly.io doesn’t make CORS unusually hard. The bad news: Fly.io also doesn’t magically solve it for you. You still need to decide where CORS lives, how strict it should be, and how it behaves across preview apps, custom domains, and edge-facing traffic. ...
CORS in Traefik is mostly a headers middleware problem. Once you get that, the config becomes pretty mechanical. The annoying part is that browsers are strict, Traefik is flexible, and bad examples online often mix app-level CORS with proxy-level CORS. I usually prefer handling CORS at the edge in Traefik when multiple services need the same behavior. It keeps backend apps simpler and avoids five different teams all inventing slightly broken header logic. ...