我正在开发一个Next.js应用程序,我有一个特定的页面,让我们称之为"谢谢",我想防止用户通过URL直接访问它.然而,我想只允许通过应用程序内的内部导航访问此页面,例如单击按钮.

我曾try 使用中间件函数将请求重定向到主页,并按预期工作.然而,当我try 使用客户端路由(例如,router.ush("/Thank-you"))导航到"谢谢"页面时,它仍然触发中间件并重定向到主页.

以下是代码的简化版本:

中间件功能(midleware.ts):

import { NextResponse } from "next/server";
import type { NextRequest } from "next/server";

export function middleware(request: NextRequest) {
  return NextResponse.redirect(new URL("/", request.url));
}

export const config = {
  matcher: ["/thank-you"],
};

按钮点击处理(YourComponent.tsx):

import { useRouter } from "next/router";

export default function Home() {
  const router = useRouter();

  const handleButtonClick = () => {
    router.push("/thank-you");
  };
...
}

我如何阻止直接访问"谢谢"页面,同时允许通过应用程序内的内部导航访问?

任何帮助或建议将不胜感激!

UPDATE

我try 了getServerSideProps,但仍然有同样的问题. 点击按钮也可以重定向至主页.

export const getServerSideProps = () => {
  return {
    redirect: {
      permanent: false,
      destination: "/",
    },
    props: {},
  };
};

推荐答案

如果对你来说什么都不管用,也许你可以考虑以下几点:

判断推荐人

这个 idea 是为了限制用户可以从你提到的页面.

代码可能如下所示:

export const getServerSideProps = (context) => {
  if (!context.req.headers.referer.contains(WHITE_LISTED_URLS)) {
    return {
      redirect: {
        permanent: false,
        destination: "/",
      },
      props: {},
    };
  };

  return {
    props: {},
  };
};

我只需要警告你,用户仍然可以绕过这个判断,所以如果你需要更安全的解决方案,它将不起作用.

Reactjs相关问答推荐

如何在react组件中使用formik进行验证

可选链和useState挂钩

Gitlab CI和VITE环境变量出现问题

如何使用react-router-dom保护嵌套在受保护路由中的嵌套路由?

如何垂直对齐 React Bootstrap Table 行中的项目

单击按钮不会切换组件(当按钮和组件位于两个单独的文件中时)

FabricJS反序列化问题

获取更多数据后更新 DOM,而不刷新 React.js 中的页面

React Router v6 路径中的符号

React - 将一个充满空值的无限大小的数组存储在 ref 中是否可以,或者我应该重置数组吗?

无法设置 null 的属性(设置src)

Recharts 笛卡尔网格 - 垂直线和水平线的不同样式

将 useState 设置为组件内部的值

如何在对话素材ui中设置边框半径?

React Router v6 - 访问嵌套路由和处理手写 url 的正确方法

react 页面更新

未捕获的错误:操作必须是使用 redux/toolkit 的普通对象

MUI 卡组件上的文本未正确对齐

npm init vite@latest 和 npm init vite 有什么区别?

React useEffect hooks return () => cleanup() vs return cleanup