@bravadoco/nuxt-redirect
Version:
Nuxt module to dynamically redirect initial requests
196 lines (145 loc) • 5.63 kB
Markdown
As original [`@nuxtjs/redirect-module`](https://github.com/nuxt-community/redirect-module) seems abandoned, I created that repo with support of:
- client redirects with `vue-router` (thanks @ricardogobbosouza);
- `permanent: true` instead of 301/302 status code (like in [next.js redirects](https://nextjs.org/docs/api-reference/next.config.js/redirects)) to avoid confusion and mistakes;
- [path-to-regexp](https://github.com/pillarjs/path-to-regexp) instead of 2 different scheme for client and server;
- redirect to external urls;
Todo:
- [ ] `to` as async function for `vue-router`;
- [ ] fill params for external url;
# Redirect Module 🔀
<!-- [![npm version][npm-version-src]][npm-version-href]
[![npm downloads][npm-downloads-src]][npm-downloads-href]
[![Circle CI][circle-ci-src]][circle-ci-href]
[![Codecov][codecov-src]][codecov-href]
[![Dependencies][david-dm-src]][david-dm-href]
[![Standard JS][standard-js-src]][standard-js-href] -->
> Nuxt module to dynamically redirect initial requests
<!-- [📖 **Release Notes**](./CHANGELOG.md) -->
## Features
Redirecting URLs is an often discussed topic, especially when it comes to
SEO. Previously it was hard to create a "real" redirect without performance
loss or incorrect handling. But this time is over!
## Setup
1. Add the `@bravadoco/nuxt-redirect` dependency with `yarn` or `npm` to your project
2. Add `@bravadoco/nuxt-redirect` to the `modules` section of `nuxt.config.js`:
3. Configure it:
```js
{
modules: [
['@bravadoco/nuxt-redirect', {
// Redirect option here
}]
]
}
```
### Using top level options
```js
{
modules: [
'@bravadoco/nuxt-redirect'
],
redirect: [
// Redirect options here
]
}
```
## Options
### `rules`
- Default: `[]`
Rules of your redirects.
### `onDecode`
- Default: `(req, res, next) => decodeURI(req.url)`
You can set decode.
### `onDecodeError`
- Default: `(error, req, res, next) => next(error)`
You can set callback when there is an error in the decode.
### `statusCode`
- Default: `302`
You can set the default statusCode which gets used when no statusCode is defined on the rule itself.
## Usage
Simply add the links you want to redirect as objects to the module option array:
```js
redirect: [
{ from: '/myoldurl', to: '/mynewurl' },
{ from: '/anotherurl', to: 'https://google.com' }
]
```
You can set up a custom status code as well. By default, it's *302*!
```js
redirect: [
{ from: '/myoldurl', to: '/mynewurl', statusCode: 301 }
]
```
You could use `permanent: true` for 301 redirect. Result the same as above.
```js
redirect: [
{ from: '/myoldurl', to: '/mynewurl', permanent: true }
]
```
We use [path-to-regexp](https://github.com/pillarjs/path-to-regexp) under the hood, so feel free to use `(.*)` and named params.
```js
redirect: [
{ from: '/myoldurl/(.*)', to: '/comeallhere' }, // Many urls to one
{ from: '/anotherold/:slug', to: '/new/:slug' } // One to one mapping
{ from: '/onemoreold/:category/:slug', to: '/new/:slug' } // Get rid of param
]
```
Furthermore you can use a function to create your `to` url as well :+1:
The requested `url` will be provided as arguments from middleware.
Function will be executed while navigation in server middleware and in client's `vue-router`.
```js
redirect: [
{
from: '/someUrlHere/(.*)',
to: (url) => {
const param = url.match(/someUrlHere\/(.*)$/)[1]
return `/posts/${param}`
}
}
]
```
<!-- And if you really need more power... okay! You can also use a factory function
to generate your redirects:
```js
redirect: async () => {
const someThings = await axios.get("/myApi") // It'll wait!
return someThings.map(coolTransformFunction)
}
```
Now, if you want to customize your redirects, how your decode is done
or when there is some error in the decode, you can also:
```js
redirect: {
rules: [
{ from: '/myoldurl', to: '/mynewurl' }
],
onDecode: (req, res, next) => decodeURI(req.url),
onDecodeError: (error, req, res, next) => next(error)
}
```
**ATTENTION**: The factory function **must** return an array with redirect
objects (as seen above). -->
## Gotchas
Due to inconsistency of server middleware and vue-router you can't use async functions for `to`.
If you want to send a PR with that feature - feel free!
## Development
1. Clone this repository
2. Install dependencies using `yarn install` or `npm install`
3. Start development server using `npm run dev`
## License
[MIT License](./LICENSE)
Copyright (c) Alexander Lichter <npm@lichter.io>
Copyright (c) Artur Kornakov <artur@bravado.co>
<!-- Badges -->
[npm-version-src]: https://img.shields.io/npm/dt/@nuxtjs/redirect-module.svg?style=flat-square
[npm-version-href]: https://npmjs.com/package/@nuxtjs/redirect-module
[npm-downloads-src]: https://img.shields.io/npm/v/@nuxtjs/redirect-module/latest.svg?style=flat-square
[npm-downloads-href]: https://npmjs.com/package/@nuxtjs/redirect-module
[circle-ci-src]: https://img.shields.io/circleci/project/github/nuxt-community/redirect-module.svg?style=flat-square
[circle-ci-href]: https://circleci.com/gh/nuxt-community/redirect-module
[codecov-src]: https://img.shields.io/codecov/c/github/nuxt-community/redirect-module.svg?style=flat-square
[codecov-href]: https://codecov.io/gh/nuxt-community/redirect-module
[david-dm-src]: https://david-dm.org/nuxt-community/redirect-module/status.svg?style=flat-square
[david-dm-href]: https://david-dm.org/nuxt-community/redirect-module
[standard-js-src]: https://img.shields.io/badge/code_style-standard-brightgreen.svg?style=flat-square
[standard-js-href]: https://standardjs.com