【问题标题】:Middleware for each route server side in Next.jsNext.js 中每个路由服务器端的中间件
【发布时间】:2023-03-26 23:44:01
【问题描述】:

我正在尝试找出一种方法,让一些代码在每个请求的初始页面加载时运行。我希望能够识别请求域并根据它重定向到网站的特定部分。

据我了解,我可以将getInitialProps 添加到自定义_app 页面,但这会禁用接下来的所有优化。另外_app 似乎不支持getServerSideProps,我认为这是一种替代方案。

我想到的另一种方法是在网站的每个页面中都有getServerSideProps,并进行我必须做的检查,但这会使每个页面在服务器端针对每个新请求重新呈现,在构建时禁用呈现即使是纯静态页面。

我可以采用其他解决方案吗?

编辑

基本上我需要请求对象,这样我才能做这样的事情:

export const getServerSideProps: GetServerSideProps = async ({
  req
}) => {
  if (req.headers.host === 'something') {
     return {
       redirect: {
         permanent: false,
         destination: "/"
       }
     }
  }

【问题讨论】:

  • 你能提供 1 个例子来说明你到底想要做什么吗?
  • 添加了一个简单的例子
  • 您想将该更改应用到多少页?全部/其中一些?确切的数字是多少?
  • 所有这些,没有确切的数字,但如果添加了新页面,它也应该进行检查

标签: javascript next.js server-side-rendering


【解决方案1】:

您可以在 next.config.js 文件中使用 Next.js redirects

module.exports = {
    async redirects() {
        return [
            {
                source: '/(.+)',
                has: [
                    {
                        type: 'header',
                        key: 'host',
                        value: 'something'
                    }
                ],
                permanent: false,
                destination: '/'
            }
        ]
    }
}

此规则将匹配任何不是/ 的路径,如果它包含所需的host 标头值,则重定向。

【讨论】:

  • 我认为这不适合我的用例。主机的值是动态的
  • @MarcoRipamonti 我猜你忘了提到这一点。该值在构建时是否已知?如果您使用getServerSideProps 来解决您在问题中提到的问题,您会不会遇到同样的问题?
  • 等一下,如果有办法否定has,我想你的解决方案可能会奏效。如果主机不是构建时已知的“东西”,我可以重定向吗?
  • value 可以是一个类似正则表达式的字符串,所以如果hostnot 'something',你可以使用它来匹配。
  • 我会尝试并报告。非常感谢!
【解决方案2】:

我会按以下顺序解决这个问题:

  1. 在您的服务器(nginx 或其他)上进行重定向,最快的解决方案
  2. 您可以创建自定义 [Next.js 服务器][1] 来处理重定向
  3. 如你所说的自定义应用程序
  4. 将重定向的每个页面都使用了RouteGuard

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-28
    • 2020-10-17
    • 2017-01-04
    • 2021-08-27
    • 1970-01-01
    • 2020-02-05
    • 2021-08-30
    • 2021-01-08
    相关资源
    最近更新 更多