HTTP status codes and the Server header — what a web port is telling you
A three-digit code and one header say whether a web service is healthy, redirecting, locked, or broken — before you open a browser.
n -h httpn check and n web make one request to each web port and print the status code and, when present, the Server header.
The codes you'll actually see
| Code | Meaning | On a home network |
|---|---|---|
| 200 | OK | the page loaded — a dashboard, a login page, an API root |
| 301 / 302 / 307 | redirect | usually http → https, or / → /login. Healthy. |
| 401 | needs credentials | an API or admin UI with auth on — good sign |
| 403 | forbidden | reachable, but you're not allowed (IP allow-list, disabled UI) |
| 404 | not found | the server runs, nothing at / — try the app's real path |
| 500 | server error | the app crashed on this request; check its logs |
| 502 / 503 / 504 | bad gateway / unavailable / timeout | a reverse proxy is up but the app behind it isn't — the container stopped, the service died |
The Server header
nginx, Caddy, Apache, Microsoft-IIS, Werkzeug (a Python dev server), Jellyfin, Synology… — it names what's answering, which is often enough to identify a mystery port. Many services hide it on purpose; that's fine.
Quick checks
curl -sI http://host:port/ shows the code and headers without downloading the page. A 502 from a proxy plus n docker . showing the container exited is the whole diagnosis.