使用 React 路由器将 React 应用程序部署到 S3 时,无法正确渲染子路由。我已经解决了 403 和 404 错误
<p>首先我想指出的是,我已经采取了故障排除步骤来解决错误 403 和 404,这些错误通常与堆栈溢出的其他线程中的此问题相关。其中包括将 CloudFront 错误页面设置为在错误 403 和 404 时重定向到 /index.html。我还尝试使用 Lambda@Edge 函数重写 URL。</p>
<p>我遇到的问题是,当我导航到根目录时,我的反应页面(使用反应路由器)正在从 aws 正确提供服务。但是当我尝试直接导航到子路线时,似乎没有任何内容呈现。但是,当我在本地计算机上提供相同的生产版本时,就没有问题了。</p>
<p>这是供参考的公共链接</p>
<p>请注意,如果您直接导航到该链接,则没有问题。但是,如果您导航到 https://d1e06h60n3f04n.cloudfront.net/preview/assetId,则不会呈现任何内容。预览页面代码如下:</p>
<pre class="brush:php;toolbar:false;">import React, { useEffect, useState } from 'react';
import { useParams } from 'react-router';
import { BlogPreview } from './BlogPreview';
export interface IBlogPostData {
title: string;
content: string;
}
export function BlogPreviewForm() {
console.log("Loading blog preview form");
var { postId } = useParams();
const [blogPostData, setBlogPostData] = useState<IBlogPostData>({ title: "", content: "" });
useEffect(() => {
async function loadPost() {
var fileContent = await fetch(`previews/${postId}`);
setBlogPostData(await fileContent.json());
}
loadPost();
}, []);
return (
<div>
<div>Blog Preview</div>
<BlogPreview title={blogPostData?.title} content={blogPostData?.content} />
<label>Api Key</label>
<input type="text"></input>
<button>SUBMIT</button>
</div>
);
}</pre>
<p>该页面应该从 assetId 获取资产并加载它。</p>
<p>我的索引 html:</p>
<pre class="brush:php;toolbar:false;">import ReactDOM from 'react-dom/client';
import './index.css';
import { AppRoutes } from './Routes';
import reportWebVitals from './reportWebVitals';
import { createBrowserRouter, RouterProvider } from 'react-router-dom';
const routes = createBrowserRouter(AppRoutes);
const root = ReactDOM.createRoot(
document.getElementById('root') as HTMLElement
);
root.render(
<React.StrictMode>
<RouterProvider router={routes} />
</React.StrictMode>
);
reportWebVitals();</pre>
<p>和我的路线定义:</p>
<pre class="brush:php;toolbar:false;">export const AppRoutes: RouteObject[] = [
{
element: <App />,
path: '/',
children: [{
path: 'preview',
children: [{
path: '/preview/:postId',
element: < BlogPreviewForm />
}]
}]
}
]</pre>
<p>我非常确定这与 CloudFront 和 S3 有关,因为它在本地渲染得很好,所以我不确定发布相关代码会有多大帮助,这就是我链接到 URL 的原因。</p>
<p>S3配置供参考:</p>