DOMException:无法在“History”上执行“replaceState”:带有 URL 的历史状态对象

2023-11-25

在反应应用程序中,在谷歌上打开网页的缓存版本时出现以下错误。

DOMException:无法在“历史记录”上执行“replaceState”:历史记录 无法在 URL 为“https://projecturl”的状态对象中创建 来源为“https://webcache.googleusercontent.com”和 URL 的文档 'https://webcache.googleusercontent.com/search?q=cache:X4dz2ukZZAYJ:https://projecturl/+&cd=1&hl=en&ct=clnk&gl=in'

enter image description here

在我们的应用程序中,我们使用react-router-dom并实现了服务器端渲染。当在谷歌搜索中使用缓存选项打开页面时,它首先加载页面几秒钟,然后在控制台中显示带有上述错误的空白页面。

在寻找解决方案时我发现https://github.com/ReactTraining/react-router/issues/5801与我的问题相关,但没有解决方案。

更新1:

同样的问题被问到here,但对于 Angular 来说。 尽管我无法理解答案中解释的内容以及它如何与我的问题相关。

我们正在使用React 可加载 SSR 插件用于我们的 React 应用程序的服务器端渲染。

更新2:

在用于服务器端渲染的 npm 包的 Git 存储库上打开了相同的问题。问题已打开

更新3:

当我通过禁用安全性在谷歌浏览器中打开该页面时,该页面工作正常。因此它不应该与我的代码相关。

此外,在 bing 搜索引擎缓存版本中打开时会出现不同的错误:

脚本资源位于重定向后面,这是不允许的。

enter image description here

在 bing 和 yahoo 搜索引擎上,404 页面均以缓存版本出现。

更新4:

这是路由文件的样子:

import React from 'react';
import { Switch, Route } from 'react-router-dom';
import Loadable from 'react-loadable';
import {
  OTPNew,
  LoginNewFb,
  OnboardingWrapper,
  PageNotFound,
  SignUpSpecialty,
  SignUpDetails,
  Feed,
} from './lazy';

const RootComponent = Loadable({
  loader: () =>
    import(/* webpackChunkName: "rootcomp" */ '../components/RootComponent'),
  loading: () => null,
  modules: ['../components/RootComponent'],
  webpack: () => [require.resolveWeak('../components/RootComponent')],
});

const signupRoutes = [
  {
    path: '/login/otp',
    component: OTPNew,
  },
  {
    path: '/login',
    component: LoginNewFb,
  },
  {
    path: '/signup/details',
    component: SignUpDetails,
  },
  {
    path: '/signup',
    component: SignUpSpecialty,
  },
];

const Routes = () => {
  return (
    <Switch>
      {signupRoutes.map(sRoute => (
        <Route
          key={sRoute.path}
          path={sRoute.path}
          render={routeProps => (
            <OnboardingWrapper>
              <sRoute.component {...routeProps} />
            </OnboardingWrapper>
          )}
        />
      ))}
      <Route path="/feed" component={Feed} />
      <Route path="/" component={RootComponent} />
      <Route path="*" component={PageNotFound} />
    </Switch>
  );
};

export default Routes;

根组件.js

    import React from 'react';
    import { Switch, Route } from 'react-router-dom';
    import { useSelector } from 'react-redux';
    import MainComponent from './MainComponent';
    import { DiscussionComponent, HomePage, PageNotFound } from '../routes/lazy';
    import { useIsMobile } from '../actions/VerifyMobileAction';
    import rootRoutes from '../routes/rootRoutes';
    import quizRoutes from '../routes/quizRoutes';
    import { parseQueryParameter, getAPIHost } from '../helpers/helperFunctions';
    
    function cacheQueryParser(query, projectCanonnicalAddr) {
      return query
        .split(projectCanonnicalAddr)
        .pop()
        .split('+')[0];
    }
    
    function getPageOrNotFound(location) {
      const queryObject = parseQueryParameter(location.search);
      const projectCanonnicalAddr = getAPIHost();
    
      if (
        location.pathname === '/search' &&
        'q' in queryObject &&
        queryObject.q.indexOf('cache') === 0 &&
        queryObject.q.indexOf(projectCanonnicalAddr) > -1
      ) {
        const replacer = cacheQueryParser(queryObject.q, projectCanonnicalAddr);
        return {
          ComponentRender: null,
          replacer,
        };
      }
      return {
        ComponentRender: PageNotFound,
        replacer: null,
      };
    }

const RootComponent = () => {
  const { OtpVerified } = useSelector(store => store.authenticationReducer);
  const isMobileViewport = useIsMobile();

  function logicForHomeRoute() {
    if (OtpVerified) {
      return {
        component: DiscussionComponent,
      };
    }
    return {
      renderHeaderDesktop: false,
      renderHeaderMobile: false,
      renderFooter: false,
      renderSideProfile: false,
      component: HomePage,
    };
  }

  const typeOfAppClassName = `${
    isMobileViewport ? 'mobile' : 'desktop'
  }-viewport-app`;

  return (
    <div className={typeOfAppClassName}>
      <Switch>
        <Route
          exact
          path="/"
          render={() => <MainComponent {...logicForHomeRoute()} />}
        />
        {[...quizRoutes, ...rootRoutes].map(sRoute => (
          <Route
            key={sRoute.path}
            path={sRoute.path}
            render={props => {
              const { location, history } = props;
              if (sRoute.path === '/:alternate_username') {
                if (location.pathname.startsWith('/dr') === false) {
                  const { replacer, ComponentRender } = getPageOrNotFound(
                    location
                  );
                  if (ComponentRender) {
                    return <ComponentRender />;
                  }
                  history.replace(replacer);
                  return null;
                }
              }
              return <MainComponent {...props} {...sRoute} />;
            }}
          />
        ))}
      </Switch>
    </div>
  );
};

export default RootComponent;

UPDATE 5

控制台中显示另一个错误:

获取脚本时收到错误的 HTTP 响应代码 (404)。


由于您在“空白页面”之前看到正常页面,我的猜测是,首先您会看到该网站的 SSR 版本,然后在加载脚本后,由于 CORS 限制,您会看到一个“空白页面”。

作为解决方案,您可以仅为您的域加载脚本,并保留 SSR 版本谷歌/必应/雅虎没有机会加载这些脚本并破坏站点。

答案是基于反应可加载 ssr 插件的例子,这里的想法是检查window.location.origin与您的域名的来源。否则,就完全跳过这些文件。

原来的例子:

res.send(`
  <!doctype html>
  <html lang="en">
    <head>...</head>
    ${styles.map(style => {
      return `<link href="/dist/${style.file}" rel="stylesheet" />`;
    }).join('\n')}
    <body>
      <div id="app">${html}</div>
      ${scripts.map(script => {
        return `<script src="/dist/${script.file}"></script>`
      }).join('\n')}
  </html>
`);

这是我的动态加载示例:

res.send(`
  <!doctype html>
  <html lang="en">
    <head>...</head>
    ${styles.map(style => {
      return `<link href="/dist/${style.file}" rel="stylesheet" />`;
    }).join('\n')}
    <body>
      <div id="app">${html}</div>
      <script>
        function loadScript(url) {
          var s = document.createElement("script");
          s.src = url; document.body.appendChild(s);
        }

        if (
          window.location.origin === "https://example.com" ||
          window.location.origin === "http://localhost" // for development purpose
        ) {
          ${scripts.map(script => {
            return `loadScript("/dist/${script.file}");`
          }).join('\n')}
        }
      </script>
  </html>
`);

当然,您的应用程序中有自己的代码,这就是为什么我不能给您提供完整的解决方案。您应该更改代码以遵循这个想法。

至于其他错误。部分地,它们也基于 CORS 限制,其中之一来自https://connect.facebook.net/en_US/fbevents.js。 404 错误与您的服务工作人员文件相关,是由谷歌内部“网络缓存”算法引起的,我不确定您是否可以对此采取措施。

无论如何,这些错误不应干扰缓存站点的正确显示,因为它们不是您看到空白页面的原因。当然,我认为这是基于屏幕截图的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DOMException:无法在“History”上执行“replaceState”:带有 URL 的历史状态对象 的相关文章

  • 接下来如何在React应用程序中使用material-ui的rtl布局

    我想在我的 React 应用程序中使用 RTL 布局 我已经使用material ui下一版本来集成这个应用程序 我使用下面的代码来制作应用程序布局 RTL 某些组件在 RTL 布局中正常工作 但某些组件不受影响 App js Layout
  • Flask 和 Reactjs 抛出 JSX 转换错误

    我已经开始将 ReactJS 与 Python Flask 后端结合使用 通过 Flask 渲染模板时 我在 Chrome 控制台中收到以下客户端错误 错误 找不到模块 jstransform visitors es6 templates
  • VirtualizedList:您有一个很大的列表,更新速度很慢

    我使用 FlatList 来处理大量项目 我收到来自 Expo XDE 的以下警报 VirtualizedList 您有一个更新速度很慢的大列表 make 确保你的 renderItem 函数渲染遵循 React 的组件 性能最佳实践 例如
  • React:React 如何确保在浏览器有机会绘制之后调用 useEffect?

    useLayoutEffect 的文档说 useLayoutEffect 内计划的更新将被刷新 在浏览器有机会绘制之前同步进行 useEffect 的文档说 与 componentDidMount 和 componentDidUpdate
  • Relay 中的嵌套片段数据始终相同

    我是 Relay 新手 并且遇到了片段上嵌套数据的问题 当我在 graphiql 中进行测试时 以下查询返回正确的数据 因此我确信我的架构是正确的 viewer customers name billing address city 但是
  • 如何使用 React TransitionMotion willEnter()

    Using React Motion 的 TransitionMotion https github com chenglou react motion 我想要为 1 个或多个盒子进出设置动画 当一个盒子进入视图时 它的宽度和高度应该从 0
  • 无法在scrollView中滚动

    我有一个屏幕 我可以在输入字段中输入内容并获得相应的搜索结果 该列表在 ScrollView 中呈现 但当键盘打开时 在 Android 中 它仍然不允许我滚动 我怎样才能解决这个问题 return lt gt addressesFound
  • 无法从 Twin.macro 中的 Prop 获取值

    您可以在这里查看我正在尝试执行的操作的示例 https codesandbox io s vibrant leaf qj8vz https codesandbox io s vibrant leaf qj8vz 注意 这个特定的例子使用双宏
  • 将 ESLint 与 Airbnb 样式和选项卡结合使用 (React.js)

    我正在开发一个 React js 应用程序 并且正在尝试检查我的代码 我将 ESLint 与 Airbnb 风格一起使用 但出现以下错误 src Test jsx 4 2 error Unexpected tab character no
  • 使用默认值反应路由参数

    我正在使用 React 功能组件和 React Router v5 我正在使用 useParam 函数来获取参数 当参数不可用或未定义时 如何设置参数的默认值 我的路由器代码
  • 使用样式组件更改 SVG 描边的颜色

    我有一个 SVG 用作 img 标签 使用样式组件 我试图达到在悬停时更改描边颜色的程度 我导入了 SVG import BurgerOpenSvg from images burger open svg 我为它创建了一个样式组件 cons
  • 对象中的字符串插值

    我有以下代码 const answerObject setAnswerObject useState const answerItem question survey id selectedAnswer setAnswerObject an
  • Redux如何处理reducer中的错误

    我不确定如何处理 redux 减速器中的错误 当我的 API 获取返回数据时 我需要转换其结构并检查结果数据上设置的各种属性 但是 我不能在减速器中抛出错误 因为 redux 至少需要返回之前的状态 我该如何处理这个问题 注意 我正在使用反
  • 为什么 useReducer 调度会导致重新渲染?

    假设我实现一个简单的全局加载状态 如下所示 hooks useLoading js import React createContext useContext useReducer from react const Context crea
  • linux azure web 应用程序不显示我的reactjs 应用程序

    我使用 npx create react app 创建了一个 Reactjs Web 应用程序 并创建了一个 azure ci cd 管道以将构建文件夹推送到我的 Linux Web 应用程序实例 我还指定了启动命令 pm2 serve h
  • 在 React 组件中等待异步函数并显示 Spinner

    初学者在这里 尝试从服务器获取一些数据并在获取后将其显示在我的反应组件中 但是 我在将异步函数集成到我的反应组件中时遇到了麻烦 import React useState from react import request from gra
  • 如何正确地将节点从引用传递到上下文?

    我正在尝试将节点从引用传递到上下文 但是因为我在第一次渲染后没有重新渲染 所以传递的节 点是null 我考虑了两种变体 但我认为它们不是最好的 To pass ref代替ref current 但在用例中 我将被迫使用类似的东西contex
  • 如何使用 Nextjs/React 将 JSON 对象导出到 Excel?

    我有一个检索 json 对象的端点 如下所示 data id 1 temaIndicador Indian codigo 001 observaciones Interactions Specialist tertiary Regional
  • 如何将React JS状态保存到本地存储中

    我不知道如何将 React js 状态存储到本地存储中 import React Component from react import App css import auth createUserProfileDocument from
  • React Hooks 常量组件与功能组件

    我理解函数组件和类组件之间的区别 但是 const 组件和函数组件之间有什么区别 e g const Home gt return div Home div To function Home return div Home div 两者都可

随机推荐

  • python中接受所有泰文字符和英文字母的正则表达式

    我需要对泰语文本文档进行矢量化 例如 Bag of Words doc2vec 首先 我想检查每个文档 省略除泰语字符和英语单词之外的所有内容 例如 没有标点符号 没有数字 除了撇号之外没有其他特殊字符 对于英文文档 我使用这个正则表达式
  • C const 的默认类型是什么?

    我正在编写一些 C 代码 并注意到我认为是错误的地方 但事实并非如此 我有以下类型声明语句 const fee 然而 它最初没有被捕获 因为编译器和我没有捕获它 所以我很好奇为什么 C 允许这样做以及默认类型是什么 只有原始版本的 C 语言
  • 字节序是否只影响数字的内存布局,而不影响字符串?

    是否真的 无论架构是大端还是小端 只是数字的内存布局不同 字符串的内存布局是相同的 如果您有一个简单的 8 位字符表示 例如扩展 ASCII 那么不会 字节顺序不会影响布局 因为每个字符都是一个字节 如果您有多字节表示形式 例如 UTF 1
  • 谷歌地图两个圆的交点

    有没有一种简单的方法可以获得lat lng两个的交点 如果有 circles in 谷歌地图 API V3 或者我应该去hard way EDIT 在我的问题中 圆总是具有相同的半径 这样可以使解决方案更容易 是的 对于相等的圆 可以阐述相
  • 使用 Firebase 身份验证的 SwiftUI

    我正在尝试通过电子邮件 密码登录使用 SwiftUI Firebase 身份验证 我的问题是 有什么方法可以在用户创建帐户时将个人资料信息附加到用户的身份验证信息中 或者我必须将 Firebase Auth 与 Firestore 或 Fi
  • 什么时候应该封装泛型类型?

    我见过很多人建议您应该使用更接近您的领域的类来封装泛型类型 例如 Steve 和 Nat 建议在以测试为指导不断发展面向对象的软件 that 我们的经验法则是 我们尝试限制使用泛型传递类型 特别是当应用于集合时 我们将其视为一种重复形式 这
  • Swift - 将重载函数分配给变量

    我收到编译时错误 指出 myFunc 引用不明确 func f s String gt String return version 1 s func f sourceString s String gt String return vers
  • Mod 安全响应/请求正文大小?

    如何在 Mod Security 中获取响应 请求正文的大小 我不断收到此错误 例如 Mon Sep 17 23 34 38 2012 error client 192 168 1 1 ModSecurity Output filter R
  • WPF 中的两种方式百分比格式绑定

    我有这个文本框
  • 为什么有些网页的源代码都是一行?

    当查看很多网页的源代码 如JS CSS HTML 时 我发现它们都在一行中 他们是怎么做到的 他们使用一些工具来制作吗 我们可以重组它吗 Thanks 它是缩小的 HTML 即删除了空格 有很多工具可以做到这一点 你可以通过谷歌搜索找到它们
  • 使用 zcat 和 sed 或 awk 编辑压缩的 .gz 文本文件

    我正在尝试编辑压缩的 fastq gz 文本文件 通过删除第 2 6 10 14 行的前六个字符 我现在有两种不同的方法来执行此操作 使用 awk 或 sed 但这些仅如果文件被解压 似乎可以工作 我想编辑这些文件而不解压缩它们 并尝试了以
  • ASP.NET、VB:如何从后台代码访问 FormView 内的控件?

    我的 FormView 控件内有一个复选框和一个面板 我需要从后面的代码访问它们 以便使用复选框确定面板是否可见 这是我最初使用的代码 但由于我将控件放在 FormView 中 所以它不再起作用 Protected Sub checkGen
  • 简单的 C++ hash_set 示例

    我是 C 和 STL 的新手 我被以下存储自定义数据结构的哈希集的简单示例所困扰 include
  • 使用“grep”搜索选项卡,不带 -P

    我以前用过grep P早些时候成功了 直到我得到了一台 grep 未编译为支持 Perl 正则表达式的机器 现在我在匹配选项卡时遇到问题 t特点 grep G t matches a literal t grep E t matches a
  • MySQL foreach 循环

    我必须迭代 MySQL 中的 User 表中的每一行 我需要为用户中的每次迭代创建一个新行地址 并具有下面描述的一些条件 我有3张桌子 User id stuff id person email Person id stuff id add
  • 以编程方式检测 SQL Server 版本

    我将 C 与 SMO 结合使用 并尝试检测我正在连接的 SQL Server 版本 例如企业版 标准版 我知道如何获取版本信息 但这只能告诉我 SQL Server 的版本 例如 SQL Server 2008 与 SQL Server 2
  • 如何从 SFSafariViewController 获取 URL?

    我正在将 iOS 中的 fitbit login api 与 Objective C 集成 我需要获取回调 URL 我目前正在使用SFSafariViewController但登录后无法读取 URL 是否可以从以下位置获取 URLSFSaf
  • Jquery防止多次提交

    如果有人多次单击其中一个提交按钮 我想防止多次提交 How can unbind or undelgate在本例中调用我的自定义函数do some stuff这种情况只发生一次 因为我尝试了一些 jquery 方法 但我认为我做错了什么 谢
  • Django 上的脆皮表单变量不存在

    对于 Django 上的脆皮形式 我不断得到VariableDoesNotExist at Failed lookup for key form in u False False None None extends base html lo
  • DOMException:无法在“History”上执行“replaceState”:带有 URL 的历史状态对象

    在反应应用程序中 在谷歌上打开网页的缓存版本时出现以下错误 DOMException 无法在 历史记录 上执行 replaceState 历史记录 无法在 URL 为 https projecturl 的状态对象中创建 来源为 https