- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的网站托管在一个子目录中,例如 http://mywebsite/admin,其中/admin 是子目录
我已将我的 React 应用程序(create-react-app 生产构建)上传到/admin 子目录中。我还使用 react-router v4 BrowserRouter 来执行一些简单的客户端路由。以下是我的 react-app 中的一些相关片段:
index.js
import React from 'react';
import ReactDOM from 'react-dom';
import App from './components/App';
import { BrowserRouter } from 'react-router-dom';
import './css/custom.css';
ReactDOM.render(<BrowserRouter basename="/admin"><App /></BrowserRouter>, document.getElementById("root"));
在 App.jsx 渲染函数中
<Route
path='/students'
render={(props) =>
<Students
{...props}
/>
}
/>
<Route
path='/teachers'
render={(props) =>
<Teachers
{...props}
/>
}
/>
浏览网站时一切正常,工作正常,包括嵌套的 url,正如您在代码片段中看到的,主要是 /admin/students
和 /admin/teachers
.
主要问题:当我在 /admin/teachers
路径上并且我刷新页面时,页面没有加载任何内容.仅当我在 /admin
路线上时刷新才有效。但不是 /admin/teachers
或 /admin/students
。
这不是我第一次使用托管在 Apache 服务器上的 react-router v4 构建 SPA。我重复使用了我之前项目中的 .htaccess。此 .htaccess 也位于 /admin
子目录中。下面是 .htaccess
:
.htaccess
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.html?path=$1 [NC,L,QSA]
这会将所有请求路由到由 create-react-app 生产构建构建的 index.html。但是,根据我的调查,这种类型的配置仅适用于不在子目录中且未使用嵌套 URL 的项目。
请注意,我现在有 2 个 .htaccess
。一个在根目录下,另一个在 /admin
子目录中。 两者都包含相同的 .htaccess
代码。这样做的原因是,我在根目录下运行了另一个 SPA。
我错过了什么?
如何在驻留在使用从 React Router 构建的嵌套 URL 的子目录中的 SPA React 应用程序上正确配置 Apache?
最佳答案
主要解决 OP's answer , 加上一些其他注释...
This is where I made a mistake:
Note, that I have 2 .htaccess now. One on root and another one at the/admin subdirectory. Both contain the same .htaccess codes. The reasonfor this is, I have another SPA running at the root directory.
这不一定是“错误”——您只需要确保使用了正确的指令即可。事实上,如果这两个 .htaccess
文件旨在成为完全独立的 SPA,则最好将它们分开。
要有两个独立的 - 相同的 - .htaccess
文件,要点是:
RewriteBase
指令。 (这将覆盖目录前缀。)当 RewriteRule
substitution 字符串是相对路径时,目录前缀(即 .htaccess 的位置
文件)在重写过程结束时添加回来。
因此,/.htaccess
和 /admin/.htaccess
将包含相同的指令:
RewriteEngine on
RewriteRule ^index\.html$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.+) index.html?path=$1 [L,QSA]
但是,此解决方案与 OP 的解决方案略有不同,即 URL 路径的 admin/
部分未传递给 path
URL 参数。如果需要,您可以对此进行硬编码。例如。 index.html?path=admin/$1
。或者在您的脚本中说明这一点。
第一个 RewriteRule
只是一个小的优化,它在请求已经被重写为 index.html
之后阻止进一步的文件系统检查。
请注意,我将 (.*)
(0 或更多)更改为 (.+)
(1 或更多)。这避免了在请求根目录时进行额外的目录检查。 IE。 example.com/
和 example.com/admin/
。您没有重写这些请求,而是依赖于适当设置的 DirectoryIndex index.html
- 这是服务器配置中的默认设置。
由于替换字符串(index.php?page=$1
)是相对的,当在文档根目录中时,它会有效地重写为/index.php
并且在 /admin/.htaccess
中时,它将有效地重写回 /admin/index.php
。
请注意,/admin/.htaccess
中的 mod_rewrite 指令完全覆盖了父 .htaccess
文件中的 mod_rewrite 指令,因为 mod_rewrite 指令在默认情况下不被继承(不同于其他模块)。
或者,为了避免重复,同时仍然维护两个单独的 .htaccess
文件,您可以在 /admin/.htaccess
文件中启用 mod_rewrite 继承。例如……
在根 /.htaccess
文件中:
RewriteEngine on
RewriteRule ^index\.html$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.+) index.html?path=$1 [L,QSA]
然后,在 /admin/.htaccess
中,您将拥有以下内容:
RewriteEngine On
RewriteOptions Inherit
这继承父 mod_rewrite 指令,就好像它们被原地复制到 /admin/.htaccess
文件中一样。
但是,这增加了一层额外的复杂性。除了 /admin
中的 SPA 现在依赖于根 .htaccess
文件之外,您现在必须小心不要添加任何中断 指令到根 .htaccess
文件。
旁白:
RewriteCond %{REQUEST_URI} admin
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) admin/index.html?path=$1 [QSA,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) index.html?path=$1 [QSA,L]
在 URL 路径中检查“admin”的第一个条件(顺便说一下,这在 URL 路径中检查“admin”anywhere - 这不是严格正确的) - 可以在 RewriteRule
指令本身中更优化地执行检查。例如:
RewriteRule ^(admin/.*) admin/index.html?path=$1 [QSA,L]
如果需要,可以将这两条规则合二为一,但可能会牺牲一些清晰度。例如:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(admin/)?.* $1index.html?path=$0 [QSA,L]
$1
反向引用然后包含可选的路径前缀,admin/
或nothing。 $0
包含完整匹配项。
关于reactjs - 如何在驻留在使用从 React Router 构建的嵌套 URL 的子目录上的 SPA React 应用程序上正确配置 Apache?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62727936/
我正在看的是在另一个 React 微前端中有一个有角度的微前端,这是我们可以通过 single-spa 实现的吗 最佳答案 是的,这可以通过两种方式完成。这取决于您的应用程序使用的框架。 选项 1:跨
总结:如何在不使用繁重的 JS 框架的情况下处理 PWA 中的导航、历史记录和深度链接? 在领导团队将现有的购物网站从 Angular 1 SPA 转换为多页面应用程序 (MPA) PWA 时,我遇到
我正在尝试使用 Angular.js 和 Express.js 创建 Node.js 应用程序。 我正在做的是使用此代码将客户名称和地址添加到列表(随机)。 var mylist = new gene
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 8 年前。 Improv
所以我在 Laravel 5.3 和 Vue 2 中开发一个网站/网络应用程序。SEO 很重要,所以我想在 Laravel + Blade 中保留网站的前端/可抓取部分,并且只保留一些不必要的小部分在
我设置了一个单页应用程序,它使用 Controller (用 PHP 编写)从 API 获取数据。到目前为止,我没有遇到任何问题,数据填充表,在选择表元素时它会使用新的 url 和部分数据(主要是 I
因此,我一直在尝试找出有关如何在 SPA 应用中处理授权(而不是身份验证)的最佳实践。 假设我有一个带有 api 后端的客户端 MVC(Angular、vuejs 等),我们如何管理应用程序的使用授权
SPA 的缺点当然是初始加载时间。 例如,我用 Durandal 创建了 AskACarPro.com。 它目前在加载时有一个“加载”屏幕。但我在想也许这是一个坏主意。它让我想起了一个全闪存网站——漂
我最近一直在阅读有关 SPA 以及它有多好的内容。 我想知道是否有人可以告诉我什么时候应该使用,或者什么时候不应该像常规 MVC 一样使用 SPA 最佳答案 MVC(Rails、MVC4)的工具更加成
基本设置:由Apache 2.4提供的Angular 1.5 SPA由REST api支持,Apache 2.4也提供了REST API。 我已经阅读了在服务器上更改了一些应用程序代码后可以使SPA更
在典型的单页应用程序(SPA,例如:React)中,整个代码包都提供给客户端。这包括应用程序的私有(private)组件,这些组件通常受到客户端授权机制的保护(例如,检查身份验证 token 是否已设
我想单独托管我的 应用程序和 网站 .层次结构如下: example.com - 网站托管在 DigitalOcean example.com/* - SPA 托管在 Firebase Hosting
我正在寻找可重复使用的解决方案,以解决用户执行的某些操作在完成之前可能需要用户进一步确认的问题。 我正在使用 React 前端和 WebAPI 后端开发应用程序。 假设用户正在发起资金转账,并假设我们
我有一个像这样的网站 http://domain/?key=32dxzQW 其中 key 是从每个用户的其他站点自动生成的 我需要知道的是访问量最大的部分,所以我正在考虑使用 GA,并且由于我的网页是
我真的很喜欢GunDb的概念,并且了解如何单独在客户端编写。 现在我使用来自 Github 的 Create-React-App。 有人知道 GunDb 的服务器端吗? 和一个 View [React
假设 ABC 公司有两个团队开发两个 SPA 应用程序:app1、app2 每个应用程序都有自己的 index.html 和关联的静态资源,例如: build / 索引.html 主.js 这是从:h
我一直在使用 AngularJS 开发 SPA,并将用户数据存储在 Angular Value 服务中,但我对此感到不舒服,主要是因为 Angular Value 不在浏览器选项卡之间共享。因此,如果
假设 ABC 公司有两个团队开发两个 SPA 应用程序:app1、app2 每个应用程序都有自己的 index.html 和关联的静态资源,例如: build / 索引.html 主.js 这是从:h
因此,我使用 Gorilla/Mux 在 Go 中设置了我的 SPA,但我想在不同的路由上运行它,这样我就可以将我的两个 Kubernetes 服务连接在一起(2 个不同的 SPA)。 难道我必须将我
我正在创建一个单页应用程序。我试图在 sql 中选择一个表并在字段中搜索特定日期 Date_Due,然后确保另一个字段 Date_Complete 为空。我试图弄清楚如何让隐藏字段填充查询中的 cfp
我是一名优秀的程序员,十分优秀!