403 Forbidden is the server saying: "I understood exactly what you asked for, and I'm refusing." It's a 4xx client error, but it's about permission, not a typo — the resource exists, you're just not allowed in.

403 vs 401: the key distinction

These two get confused constantly:

  • 401 Unauthorized → "Who are you? Authenticate and try again." Logging in may fix it. See 401 Unauthorized.
  • 403 Forbidden → "I know who you are (or don't care), and you still can't have this." Logging in usually won't help.

Common causes

CauseWhat's happening
File permissionsWrong mode/ownership on the file or directory
Access rules.htaccess or server config denying access
No index fileDirectory listing disabled and no index.html
IP blockYour IP/region is on a deny list
WAF / CloudflareA security rule flagged the request
Authorization logicThe app checks a role/scope you don't have

How to fix it — as a visitor

  • Re-check the URL — a wrong path to a protected directory returns 403.
  • Clear cookies and cache; an expired session can trigger it.
  • Turn off a VPN/proxy that might be on an IP block.
  • Log in if the page is behind authentication.

How to fix it — as a developer

  1. Permissions: directories 755, files 644; correct ownership for the web user.
  2. Access rules: review .htaccess / Nginx location blocks for deny directives.
  3. Index file: add one or enable listing if appropriate.
  4. IP & WAF: check allowlists and firewall/WAF logs for false positives.
  5. Authorization: confirm your role/scope checks aren't rejecting valid users — and that they are rejecting invalid ones (a 403 is also your access control working).

When a spike of 403s matters

One 403 is a permissions glitch. A surge of 403s can mean two very different things: a deploy that broke your access rules and is locking out real users, or an attacker probing for resources they shouldn't reach. Either way you want to know fast.

Nurbak Watch tracks status codes per endpoint, so a sudden rise in 403/401 responses alerts you immediately — and Nurbak's scanner checks your app for the broken authorization that causes them. See the API security checklist.

Related HTTP status codes