Reserved paths

A few URL paths never reach your deployment: the platform answers them first, or refuses them. This reference lists them as of 2026-10-04, so that you can choose route paths, file names and worker paths that always reach your code. The same rules apply on every name.rt.ht host and on custom domains.

Platform files

These three files are answered on the root of every host, before the deployment is read. The last column says what decides the answer.

PathAnswerAnswered byNotes
/favicon.icoThe RTEdge.net logo as SVG. A request referred by a .js, .css or .html file is redirected to an emoji icon, and a request referred by a worker URL (/:) to a gear icon.PlatformThe exact path only. A host-root route never serves a favicon.ico export, but path routes are unaffected, so /docs/favicon.ico is yours. Give pages an icon with <link rel=icon href=…>.
/apple-touch-icon*A 307 redirect to https://rtcode.io/.svg, the RTCode.io mark. The query is dropped.PlatformEvery path that starts with /apple-touch-icon. Deployments cannot serve files with these names; point <link rel=apple-touch-icon href=…> at a file with another name.
/robots.txtA fixed text policy: a notice that automated collection is prohibited except as the content-usage directives allow, then User-Agent: *, Content-Usage: tdm=n, search=y, inference=y, Allow: / and Crawl-delay: 10.PlatformThe exact path only. A host-root robots.txt export is never served. A path route's own /docs/robots.txt is not intercepted, but crawlers read only the file at the host root.

Platform suffixes

The platform matches these patterns on the raw URL, on every URL of every platform host, whether or not anything is deployed there. Most of them match anywhere in the path, not only at the end, so they also claim worker paths such as /:api::save. They are answered before your deployment is read, so a worker cannot override them.

PatternWhere it matchesAnswerAnswered by
::s…Anywhere in the path. The letters after the last ::s choose the action.The sign-in actions ::si, ::sa, ::su and ::so, described in Adding sign-in. Letters that name no action return a 501 page, "Invalid affix". The related forms ::sit, ::sud and ::sh are Experimental.Platform
::i ::e ::cA path that ends in one of them, optionally followed by word characters, such as ::edit or ::code.A 303 redirect to the source view, ?. ExperimentalPlatform
::vA path that ends in ::v, optionally followed by word characters, such as ::versions.A 303 redirect to ??, the version viewer. ExperimentalPlatform
::u ::tA path that ends exactly in ::u or ::t.A 303 redirect to usage analytics or tail logs. See Usage and tail logs. ExperimentalPlatform
Other ::i ::e ::c ::u ::t ::v pathsAny other path that contains one of these after :: and does not end in ::clear.An empty 404, with no body.Platform
/::edgeAnywhere in the path, with a slash before ::edge.Diagnostics about how the request was served, as JSON. ExperimentalPlatform
::clearAt the end of the path.Clears this site's data in the visitor's browser. ExperimentalPlatform
::qrAt the end of the path.A QR code as SVG. ExperimentalPlatform
?::/h:The raw query string contains ::/h:.The response of the URL with its headers changed. ExperimentalPlatform

Warning: Avoid :: in route paths, file names and worker paths. A path such as /a::cool is read as an edit shortcut and redirects to /a?, /::sfoo returns a 404, and /:api::save opens a sign-in page and never reaches your worker.

Reserved on every route

After the platform has had its turn, the edge router answers these paths and queries for every deployment. Request routing shows where they sit in the order.

PatternAnswerAnswered by
/::owner /::kv /::metaWhether you own the route, the KV viewer, and the deployment digest. The text after the first : must be exactly :owner, :kv or :meta. ExperimentalRouter
A trailing *The index of the deployments you can edit under that host or path. It needs sign-in.Router
A URL ending in ??A 307 redirect to the version viewer, even for a route that was never deployed.Router
? and a URL ending in /?The source view, which opens the deployment's source in RTCode.io. The forms ?io and ?sync Experimental do the same.Router
?m=uo, ?ogo, ?<ext> and the social preview parametersAn ownership check, the generated social tags alone, a content-type override for the page, and per-link preview overrides. See Query parameters. ExperimentalRouter
Any other :Everything after the first : becomes the worker's pathname. A route without a worker answers 404, "Worker does not exist."Your worker

The URL suffixes reference describes each of them.

Canonical redirects

Before routing, the platform rewrites some URLs. All of these are 307 redirects, and they apply to every method.

RequestRedirected toNotes
/docs/docs/A path with no trailing slash that contains no ., * or :. The query is kept. The new URL belongs to the route name/docs, not to the route name.
/docs?/docs/?For document and iframe navigations. This keeps the bare ?, so name.rt.ht/docs? opens the source view.
/docs:/docs/:A path that ends in a single :, so that it reaches the worker of the route name/docs.
/docs/*/docs*A path that ends in /*, other than /* itself.

Paths are also normalized before routing, so //nav.js, /x/../nav.js and /%6eav.js all serve /nav.js. File names are case-sensitive: /NAV.JS answers 404, "File does not exist."

Names to avoid

The platform refuses requests whose path contains any of the strings below, ignoring case, before they reach your deployment. They count anywhere in the path, so they also apply to route paths, export names and worker paths. A route named name/php-notes, for example, is unreachable.

StringNames it rules out
phpindex.php, info.php, /php-notes/
wordpress/wordpress/, /my-wordpress-site/
/wp-/wp-admin/, /wp-content/, /wp-notes.html
/cgi-bin//cgi-bin/test
/.well-known/.well-known/anything
/.git/.git/config, /.gitignore
/.env/.env, /.env.local
/.aws/.aws/credentials

Note: Check a name against this list before you build a site around it. A refused request never reaches the router, so none of the pages in Error pages and status codes describes it.

Export names

The name in o: becomes the last segment of a URL, so a few more rules apply to the files you export. Stick to letters, digits, _ and - plus one ., or to leading-dot names such as .css and .js.

RuleWhy
The name contains a .A path with no ., * or : and no trailing slash is redirected to its slash form (see Canonical redirects), so a dotless name can never be reached.
The name has no /A file exists only directly under its route. /route/sub/x.js belongs to the route route/sub.
No :, ? or #, and no trailing *A : sends the path to the worker, ? and # start the query and the fragment, and a trailing * asks for the index.
No :: suffix patternSee Platform suffixes.
favicon.ico, robots.txt, apple-touch-icon* on a host-root routeThe platform answers these paths first (see Platform files). A path route can export them under its own path.
The name matches in caseFile names are case-sensitive, and the query is ignored: x.js?v=2 serves x.js.
No spaces or non-ASCII charactersThe URL is compared with the name in its percent-encoded form, so names such as my file.txt or café.txt may not match.

See Exporting files with o: for how exports are served.

Route names

See Routes for the recommended grammar, normalization and examples.

In the playground

The playground output does not apply these reservations, except ::su, which it answers itself. There, /favicon.ico, /robots.txt and :: paths other than ::su reach your worker. On RTEdge.net they never do, so test such paths on a deployment. Playground and edge differences lists the rest.

See also