从浏览器URL进行React Router Render

如何解决从浏览器URL进行React Router Render

因此,我使用React建立了一个网站,但是没有一条路线可以直接访问。如果重要的话,托管我的反应代码的服务器是CPanel。

我了解到对于诸如www.website.com/about之类的路由,服务器上实际上不存在“ / about”。当用户单击应用程序并“浏览”网页时,React动态更新浏览器URL。如果用户尝试直接访问about路由,则服务器将不知道该怎么做,除非我做一些额外的工作。

但是必须有一种方法可以直接在浏览器中键入“ www.website.com/about”(使用基于React的网站)并直接访问该页面,对吧?

我读了thisthis,都提到了全部解决方案。我想到目前为止,我的“ htaccess”文件已经获得了该解决方案的一半(例如,如果您在浏览器URL中键入www.website.com/about,它将仅重定向到我网站的首页)。

现在,我希望我的代码能够解析浏览器URL,并知道呈现正确的页面/组件,而不仅仅是重定向到我的主页。我的困惑源于以下内容(引自第二个链接):

包罗万象

如果您已经在使用服务器,则可能是 你最好的选择。这里的主要思想是您重定向所有 服务器请求/index.html。结果类似于哈希 历史。 对服务器的任何请求都将以 索引页(然后获取所需的任何JS资源),React Router 然后将接管并加载适当的视图。的实际代码 这取决于您拥有的服务器类型。

(重点是我的)

因此,我的.htaccess文件确实可以对index.html页面做出响应。现在,我希望React Router“接管并加载适当的视图”。这是我的代码有问题还是与服务器有关?

作为参考,以下内容包含我的.htaccess文件的内容。 (提前道歉,我对如何编写htaccess文件一无所知,这些文件都是从我发现的随机教程中复制的):

RewriteEngine On 
RewriteBase /
RewriteCond %{SERVER_PORT} 80
RewriteCond %{HTTP_HOST} ^(www\.)?wiseattend\.com
RewriteRule ^(.*)$ https://www.wiseattend.com/$1 [R,L]
RewriteCond %{THE_REQUEST} /([^.]+)\.html [NC]
RewriteRule ^ /%1 [NC,L,R]
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^ %{REQUEST_URI}.html [NC,L]
RewriteRule ^index\.html$ / [R=301,L]

RewriteRule ^index\.html$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule . /index.html [L]

这是我的反应代码中的App.js文件:

import React,{ useState,useLayoutEffect,useEffect } from 'react';
import { BrowserRouter as Router,Route,Switch,Redirect } from 'react-router-dom';
import { history } from './history';


// components
// pages
import Home from './pages/Home';
import Privacy from './pages/Privacy';
import Contact from './pages/Contact';


const App = () => {

  return (
    <div className="app">
      <Router history={history}>
        <NavBar />
        <Switch>
          <Route exact path="/" render={(props) => <Home {...props} />} />
          <Route path="/privacy" render={(props) => <Privacy {...props} />} />
          <Route path="/contact" render={(props) => <Contact {...props} />} />
        </Switch>
        <Footer />
      </Router>
    </div>
  );
}

export default App;

这是我的index.js

import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
import { BrowserRouter } from 'react-router-dom';

ReactDOM.render(
  <BrowserRouter>
    <App />
  </BrowserRouter>,document.getElementById('root')
);

我觉得React Router应该足够聪明,可以解析一个URL并呈现我需要的实际组件(我的.htaccess文件服务于index.html),并且很可能我丢失了在我的代码中可以完成此操作的东西。我觉得这可能与我的历史对象有关,但我不确定。

任何帮助将不胜感激。

解决方法

因此,我通过修复.htaccess文件来解决此问题。我将提供文件的内容(从基本教程here中获取),然后解释为什么我认为它可以解决我的问题。

RewriteBase /
RewriteRule ^index\.html$ - [L]
 RewriteCond %{REQUEST_FILENAME} !-f
 RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.html [L]

所以我遇到的错误行为是我的网站将所有端点重新路由到主页。因此,如果我要手动刷新或(手动键入浏览器www.website.com/about,浏览器会将其发送到首页www.website.com。相反,我希望React能够呈现www.website.com/about

的所有组件

我在旅途中学到的一些知识对于实现我的解决方案至关重要:

  • www.website.com/about在服务器上不存在。因此,您需要提示服务器知道为服务器请求以下路由的index.html服务:是//about还是/anyrandomthing,您的服务器应该知道始终提供index.html文件,而React应该处理其余的文件。就我而言,由于我使用的是服务器,实现该逻辑的文件是.htaccess

  • 反应路由器会动态更新浏览器URL,但不会发出服务器请求。因此,当用户单击我主页上的“关于我们”按钮时,它实际上并不是在发出服务器请求,它所要做的只是在适当时提示React代码呈现Route组件,并更新浏览器网址以使其似乎用户正在浏览网页。

我的问题是我的旧.htaccess遇到未知路由,并修复了浏览器URL以引用基准(服务器上不存在/about,因此它将浏览器URL更改为{{ 1}})。相反,我需要修改我的/文件以为任何路由提供.htaccess并保留该路由,以便React Router可以呈现适当的组件

基本上:

错误的方法index.html->将浏览器网址固定为/about,投放/

正确方法index.html-> 将浏览器URL固定为/about (React Router将看到该URL并作出适当响应),投放/

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-