|
| 1 | +--- |
| 2 | +title: Gateway redirects |
| 3 | +description: What gateway redirects are and how to use them with a website on IPFS. |
| 4 | +--- |
| 5 | + |
| 6 | +# THIS IS A DRAFT. DO NOT MERGE. |
| 7 | + |
| 8 | +# To do: |
| 9 | +1. How to redirect old URL to a new place (301 and 302 redirects) |
| 10 | +1. How to use it for PWA/SPA hosting (catch-all 200) |
| 11 | +1. How to use it to provide custom `404 not found` pages (superceding what `ipfs-404.html` does - ideally not mention old way) |
| 12 | + |
| 13 | +# Gateway Redirects |
| 14 | + |
| 15 | +Gateway Redirects provide support for URL redirects and rewrites for websites hosted on Subdomain or DNSLink gateways. This feature enables support for single-page applications, and avoids link rot when moving to IPFS-backed hosting. |
| 16 | + |
| 17 | +Using Gateway Redirects, you can change the appearance of a URL, change where content is located without breaking existing links, redirect invalid URLs to a custom 404 page, and enable URL rewriting. |
| 18 | + |
| 19 | +# Supported HTTP status codes |
| 20 | + |
| 21 | +* `200` - OK (redirect will be treated as a rewrite, returning OK without changing the URL shown in the browser). |
| 22 | +* `301` - Permanent redirect (the default status). |
| 23 | +* `302` - Found (commonly used for temporary redirects). |
| 24 | +* `303` - See other (replaces PUT and POST with GET). |
| 25 | +* `307` - Temporary redirect (preserves the body and HTTP method of the original request). |
| 26 | +* `308` - Permanent redirect (preserves the body and HTTP method of the original request). |
| 27 | +* `404` - Not found (can be used redirect to custom 404 pages). |
| 28 | +* `410` - Gone (the requested content has been permanently removed). |
| 29 | +* `451` - Unavailable for legal reasons. |
| 30 | + |
| 31 | +# How to set up gateway redirects |
| 32 | + |
| 33 | +To use Gateway Redirects, there must be a file named `_redirects` stored underneath the root CID of the website. This `_redirects` file must be a text file containing one or more lines that follow the format explained below. |
| 34 | + |
| 35 | +## Format of the `_redirects` file |
| 36 | + |
| 37 | +Each line contained within the `_redirects` file has 3 basic components: |
| 38 | + |
| 39 | +1. The `from` path, this specifies the path to be redirected from. |
| 40 | +1. The `to` path, this specifies the path to be redirected to. |
| 41 | +1. The `status` component, this part is optional and specifies the HTTP status code that will be returned. (301, 404, etc.) |
| 42 | + |
| 43 | +For example, if I want to redirect a page to a custom `404` page, the `_redirects` file will contain a line that looks something like this: |
| 44 | +``` |
| 45 | +/<requested page> /custom404.html 404 |
| 46 | +``` |
| 47 | + |
| 48 | +The same format is used for all redirects. |
| 49 | + |
| 50 | +## Placeholders |
| 51 | + |
| 52 | +Placeholders are named variables that can be used to match path segments in the `from` path and inject them into the `to` path. |
| 53 | + |
| 54 | +For example, if I wanted to search for an article titled "hello world" that was written on June 15, 2022, I could search for it like this: `/posts/06/15/2022/hello-world` and be redirected to `/articles/2022/06/15/hello-world` |
| 55 | + |
| 56 | +## Splat |
| 57 | + |
| 58 | +If the `from` path ends with an asterisk (`*`), the rest of the `from` path will be slurped up into the special `:splat` placeholder, which can then be injected into the `to` path. |
| 59 | +``` |
| 60 | +/posts/* /articles/:splat |
| 61 | +``` |
| 62 | +:::note |
| 63 | +Splat logic must only apply to a single trailing asterisk, as it is a greedy match that consumes the remainder of the path. ::: |
| 64 | + |
| 65 | +## Comments |
| 66 | + |
| 67 | +Any line in the `_redirects` file that begins with `#` will be ignored and treated as a comment. |
| 68 | + |
| 69 | +## Line termination |
| 70 | + |
| 71 | +Each line in the `_redirects` file must be terminated with either `\n` or `\r\n`. |
| 72 | + |
| 73 | +``` |
| 74 | +/<requsted page> /custom404.html 404 \n |
| 75 | +/home /index.html \n |
| 76 | +``` |
| 77 | +# Evaluation |
| 78 | + |
| 79 | +Rules must only be evaluated when hosted on a subdomain or DNSLink gateway, this is to maintain same-origin isolation. |
| 80 | + |
| 81 | +## Order |
| 82 | + |
| 83 | +Rules must be evaluated in order, redirecting or rewriting using the first matching pair. |
| 84 | + |
| 85 | +## No forced redirects |
| 86 | + |
| 87 | +Redirect logic will only be evaluated if the requested path is not in the DAG. Any performance impact associated with checking for the existence of a `_redirects` file or evaluating redirect rules will only be incurred for non-existent paths. |
| 88 | + |
| 89 | +# Error handling |
| 90 | + |
| 91 | +If there are any errors reading or parsing the `_redirects` file, the error codes will be returned with an HTTP 500 status code. |
0 commit comments