Redirects
To apply custom redirects on Cloudflare Pages, declare your redirects in a plain text file called _redirects without a file extension, in the static asset directory of your project. This file will not itself be served as a static asset, but will instead be parsed by Cloudflare Pages and its rules will be applied to static asset responses.
If you are using a framework, you will often have a directory named public/ or static/, and this usually contains deploy-ready assets, such as favicons, robots.txt files, and site manifests. These files get copied over to a final output directory during the build, so this is the perfect place to author your _redirects file. If you are not using a framework, the _redirects file can go directly into your build output directory.
Only one redirect can be defined per line and must follow this format, otherwise it will be ignored.
[source] [destination] [code?]-
sourcestring required- A file path.
- Can include wildcards (
*) and placeholders. - Because fragments are evaluated by your browser and not Cloudflare's network, any fragments in the source are not evaluated.
-
destinationstring required- A file path or external link.
- Can include fragments, query strings, splats, and placeholders.
-
codenumber (default: 302) optional- Optional parameter
Lines starting with a # will be treated as comments.
A _redirects file is limited to 2,000 static redirects and 100 dynamic redirects, for a combined total of 2,100 redirects. Each redirect declaration has a 1,000-character limit.
In your _redirects file:
- The order of your redirects matter. If there are multiple redirects for the same
sourcepath, the top-most redirect is applied. - Static redirects should appear before dynamic redirects.
- Redirects are always followed, regardless of whether or not an asset matches the incoming request.
A complete example with multiple redirects may look like the following:
/home301 / 301/home302 / 302/querystrings /?query=string 301/twitch https://twitch.tv/trailing /trailing/ 301/notrailing/ /nottrailing 301/page/ /page2/#fragment 301/blog/* https://blog.my.domain/:splat/products/:code/:name /products?code=:code&name=:nameCloudflare currently offers limited support for advanced redirects.
| Feature | Support | Example | Notes |
|---|---|---|---|
| Redirects (301, 302, 303, 307, 308) | ✅ | /home / 301 | 302 is used as the default status code. |
| Rewrites (other status codes) | ❌ | /blog/* /blog/404.html 404 | |
| Splats | ✅ | /blog/* /posts/:splat | Refer to Splats. |
| Placeholders | ✅ | /blog/:year/:month/:date/:slug /news/:year/:month/:date/:slug | Refer to Placeholders. |
| Query Parameters | ❌ | /shop id=:id /blog/:id 301 | |
| Proxying | ✅ | /blog/* /news/:splat 200 | Refer to Proxying. |
| Domain-level redirects | ❌ | workers.example.com/* workers.example.com/blog/:splat 301 | |
| Redirect by country or language | ❌ | / /us 302 Country=us | |
| Redirect by cookie | ❌ | /\* /preview/:splat 302 Cookie=preview |
Redirects execute before headers, so in the case of a request matching rules in both files, the redirect will win out.
On matching, a splat (asterisk, *) will greedily match all characters. You may only include a single splat in the URL.
The matched value can be used in the redirect location with :splat.
A placeholder can be defined with :placeholder_name. A colon (:) followed by a letter indicates the start of a placeholder and the placeholder name that follows must be composed of alphanumeric characters and underscores (:[A-Za-z]\w*). Every named placeholder can only be referenced once. Placeholders match all characters apart from the delimiter, which when part of the host, is a period (.) or a forward-slash (/) and may only be a forward-slash (/) when part of the path.
Similarly, the matched value can be used in the redirect values with :placeholder_name.
/movies/:title /media/:titleProxying will only support relative URLs on your site. You cannot proxy external domains.
Only the first redirect in your will apply. For example, in the following example, a request to /a will render /b, and a request to /b will render /c, but /a will not render /c.
/a /b 200/b /c 200A _redirects file has a maximum of 2,000 static redirects and 100 dynamic redirects, for a combined total of 2,100 redirects. Use Bulk Redirects to handle redirects that surpasses the 2,100 redirect rules limit of _redirects.
To use Bulk Redirects, refer to the Bulk Redirects dashboard documentation or the Bulk Redirects API documentation.
Was this helpful?
- Resources
- API
- New to Cloudflare?
- Directory
- Sponsorships
- Open Source
- Support
- Help Center
- System Status
- Compliance
- GDPR
- Company
- cloudflare.com
- Our team
- Careers
- © 2025 Cloudflare, Inc.
- Privacy Policy
- Terms of Use
- Report Security Issues
- Trademark