Beim Bereitstellen einer React-Anwendung auf S3 mithilfe von React Router werden untergeordnete Routen nicht korrekt gerendert. Ich habe die Fehler 403 und 404 behoben
<p>Zuerst möchte ich darauf hinweisen, dass ich die Schritte zur Fehlerbehebung unternommen habe, um die Fehler 403 und 404 zu beheben, die häufig mit diesem Problem in anderen Threads auf Stack Overflow verbunden sind. Dazu gehört, dass die CloudFront-Fehlerseite bei den Fehlern 403 und 404 auf /index.html umgeleitet wird. Ich habe auch versucht, die URL mit der Lambda@Edge-Funktion neu zu schreiben. </p>
<p>Das Problem, das ich habe, ist, dass meine React-Seite (mit React-Router) von aws korrekt bereitgestellt wird, wenn ich zum Stammverzeichnis navigiere. Aber wenn ich versuche, direkt zur Unterroute zu navigieren, scheint nichts gerendert zu werden. Wenn ich jedoch dieselbe Produktionsversion auf meinem lokalen Computer bereitstelle, gibt es kein Problem. </p>
<p>Dies ist ein öffentlicher Link als Referenz</p>
<p>Bitte beachten Sie, dass es kein Problem gibt, wenn Sie direkt zum Link navigieren. Wenn Sie jedoch zu https://d1e06h60n3f04n.cloudfront.net/preview/assetId navigieren, wird nichts gerendert. Der Code der Vorschauseite lautet wie folgt: </p>
<pre class="brush:php;toolbar:false;">import React, { useEffect, useState } from 'react';
import { useParams } from 'react-router';
import { BlogPreview } from './BlogPreview';
Exportschnittstelle IBlogPostData {
Titel: Zeichenfolge;
Inhalt: Zeichenfolge;
}
Exportfunktion BlogPreviewForm() {
console.log("Blog-Vorschauformular wird geladen");
var { postId } = useParams();
const [blogPostData, setBlogPostData] = useState<IBlogPostData>({ title: "", content: "" });
useEffect(() => {
asynchrone Funktion loadPost() {
var fileContent = waiting fetch(`previews/${postId}`);
setBlogPostData(await fileContent.json());
}
LoadPost();
}, []);
zurückkehren (
<div>
<div>Blog-Vorschau</div>
<BlogPreview title={blogPostData?.title} content={blogPostData?.content} />
<label>API-Schlüssel</label>
<input type="text"></input>
<button>SENDEN</button>
</div>
);
}</pre>
<p>Die Seite sollte das Asset von assetId abrufen und laden. </p>
<p>Mein Index html:</p>
<pre class="brush:php;toolbar:false;">reactDOM aus 'react-dom/client' importieren;
import './index.css';
import { AppRoutes } from './Routes';
importiere reportWebVitals aus './reportWebVitals';
import { createBrowserRouter, RouterProvider } from 'react-router-dom';
const Routen = createBrowserRouter(AppRoutes);
const root = ReactDOM.createRoot(
document.getElementById('root') als HTMLElement
);
root.render(
<React.StrictMode>
<RouterProvider router={routes} />
</React.StrictMode>
);
reportWebVitals();</pre>
<p>und meine Routendefinition: </p>
<pre class="brush:php;toolbar:false;">export const AppRoutes: RouteObject[] = [
{
Element: <App />,
Weg: '/',
Kinder: [{
Pfad: 'Vorschau',
Kinder: [{
Pfad: '/preview/:postId',
Element: < BlogPreviewForm />
}]
}]
}
]</pre>
<p>Ich bin mir ziemlich sicher, dass dies etwas mit CloudFront und S3 zu tun hat, da es lokal einwandfrei gerendert wird. Daher bin ich mir nicht sicher, ob die Veröffentlichung des relevanten Codes viel helfen würde, weshalb ich auf die URL verlinke. </p>
<p>S3-Konfiguration als Referenz:</p>