在使用 react 构建的网站中提供另一个(独立)页面或静态文件

Posted

技术标签:

【中文标题】在使用 react 构建的网站中提供另一个(独立)页面或静态文件【英文标题】:Serve another(standalone) page or static file in website built with react 【发布时间】:2018-01-28 16:05:20 【问题描述】:

我有一个用 react 构建的网站,它使用 react-router。对于某些路由,我想提供另一个页面或静态文件,但是由于所有请求都转发到反应路由器,因此它不起作用。

例如

www.myapp.com/sitemap.xml www.myapp.com/something.html

^ 这些链接第一次工作,但是一旦我加载网站然后它就不起作用,因为所有请求都通过反应路由器。

使其始终有效的任何解决方案。谢谢。

编辑

我正在使用配置为将所有请求重定向到 index.html 的 apache 服务器,我想这就是这种行为的原因。这是我的配置,但我不知道如何解决。

Options -MultiViews
RewriteEngine On

RewriteCond %HTTPS off
RewriteRule (.*) https://%HTTP_HOST%REQUEST_URI [R,L]

RewriteCond %REQUEST_FILENAME !-f
RewriteRule ^ index.html [QSA,L]

更新 我尝试了答案中建议的解决方案。

我的路线看起来像这样,对于 something.html 我正在加载 ServerLoad 组件

<Switch>
    <Route exact path="/" component=Home />
    <Route path="/about" component=About />
    <Route path="/about" component=About />
    <Route path="something.html" component=ServerLoad />
    <Route component=NoMatch />
</Switch>

在 ServerLoad 组件的 componentDidMount 函数中,我这样做了。但它不起作用。

componentDidMount() 
    window.location.reload(true);

更多 我已经使用 create-react-app 设置了这个项目,并通过 express server(like this) 为其提供服务。我不确定我是否需要在那里做一些设置来服务器其他静态文件。

【问题讨论】:

您是否尝试过使用普通的&lt;a href="/something.html"&gt;&lt;/a&gt; 标签而不是 react-router Link 组件? 是的,我做到了,即使我手动粘贴 url(一旦我加载了网站),它也会响应路由器并且不加载任何内容。 你使用的是什么版本的 react-router?我正在使用 3.0.5,当我给它 方式时,它对我来说工作正常。你能分享你的代码片段吗? 我正在使用 react 路由器 4。我尝试设置 window.href.location 但那不起作用 在您的 htaccess 中为该特定文件创建一个例外 :) 【参考方案1】:

这应该可行:

const reload = () => window.location.reload();

<Router>
  // all your routes..
  ...

  // Your special routes..
  <Route path="/sitemap.xml" onEnter=reload />
  <Route path="/something.html" onEnter=reload />
</Router>

所以,我认为这应该很清楚它的作用;)

更新:

如果这是一个选项,您可以简单地将 target="_blank" 属性放入您的 &lt;Link&gt;

恕我直言,这从用户体验的角度来看更好,因为如果这些路由不是您的主应用程序的一部分,用户可以在访问该 特殊 页面后切换选项卡。

【讨论】:

嗨,我试过了,检查有问题的更新。它不起作用 好的所以这个解决方案有效,但如果您注册了服务工作者,它可能无法工作properly。因为 Create-React-App 开箱即用地支持此功能,所以它在我的站点中启用。我禁用了服务人员,现在它可以工作了。 谢谢@webdeb 很高兴为您提供帮助。您能否深入探讨一下服务人员的问题?知道服务工作者运行时有什么区别会很有趣.. 是的,我打算这样做,但现在我的日程安排很紧。我会更新的。【参考方案2】:

这是 ServiceWorker.js 的不良行为,使用下面的评论并在您的 React 项目的 index.js 中更改它(如果您不需要服务工作者),它应该可以工作

import  unregister  from './registerServiceWorker';
unregister();

https://github.com/facebookincubator/create-react-app/issues/2715

如果您仍然需要 Service Worker 并且希望避免它出现这种行为,请考虑安装自定义 Service Worker,您可以在其中建立要忽略的路径白名单。有关更多信息,您可以查看下一个链接。

https://medium.com/swlh/how-to-implement-custom-service-worker-in-create-react-app-without-eject-bfa2c5f4ae96

【讨论】:

我遇到了同样的问题,这就是我建议这个解决方案的原因 您可以将其配置为免除 index.html 完成的请求,而不是取消注册您的服务 woerker。【参考方案3】:

如果您需要 /terms 重定向到 /terms.html,下面的代码适用于 react-router 3.x

const reload = () => window.location.reload();
<Router>
  <Switch>
    <Route exact path="/" component=Home />                
    <Route path="/terms.html" render=reload />
    <Route path="/privacy.html" render=reload />
    <Route path="/terms" render=() => <Redirect
        to=
          pathname: "/terms.html"
        
      /> 
    />
    <Route path="/privacy" render=() => <Redirect
        to=
          pathname: "/privacy.html"
        
      /> 
    />
  </Switch>
</Router>

【讨论】:

【参考方案4】:

使用 Switch 结合 NoMatch 组件,结合 webdeb 的解决方案:

<Router>
  <div>
    <Switch>
      <Route exact path="/" component=Home />
      <Route exact path="/admin" component=Admin />
      <Route component=NoMatch />
      <Route onEnter=() => window.location.reload() />
    </Switch>
  </div>
</Router>

这将匹配路由,如果不存在有效的href,则显示404,如果是有效的href,则显示文件或其他内容。

【讨论】:

【参考方案5】:

简单地将您的静态文件(如 sitemap.xml)放在 React 的 public 文件夹中的 index.html 旁边。

我认为这是最简单的方法。

【讨论】:

【参考方案6】:

如果页面与 Reactjs App 完全无关(即使用另一个目录),我认为我们可以使用以下代码从 Node 层对其进行路由,以便结构更直观:

app.use('/url_to_static_pages', express.static('path_to_static_files'));

【讨论】:

OP 没有提到任何关于使用节点的内容

以上是关于在使用 react 构建的网站中提供另一个(独立)页面或静态文件的主要内容,如果未能解决你的问题,请参考以下文章

如何将 React 应用程序构建为另一个网站内的小部件

仅当通过另一个文件提供链接时如何显示按钮(React)

当它是另一个项目的依赖项时,捆绑我的汇总项目是什么

使用RequireJS将React16 Build加载到另一个应用程序中

如何以编程方式填充使用 React 构建的输入元素?

React.js 与 Node.js Rest API