Ich habe eine Angular 10-SPA, die ich von einem Apache 2.4.29 HTTP-Server aus bereitstelle, und sehr wenig praktische Erfahrung mit HTTP-Servern im Allgemeinen, abgesehen davon, dass ich diesen hier zum Laufen gebracht und einen WSGI-Anwendungsserver bedient habe. Da dieser HTTP-Server auch mein Backend bedient (einen Django-Anwendungsserver über WSGI, der über das Django-Rest-Framework eine Verbindung zu meiner Datenbank herstellt), ist meine SPA nicht der Empfänger aller eingehenden Anfragen, sondern nur derjenigen, die mit einem bestimmten Präfix beginnen, z. B. www.mypage.com/prefix/
. Ich habe versucht, es so zu konfigurieren, dass im Wesentlichen jede URL, die dies /prefix
direkt nach der Domäne hat, an meine SPA weitergeleitet wird, die index.html
sich in befindet frontendfolder
, was dann hoffentlich sofort mit dem Erstellen der Seite für diese bestimmte Route beginnt.
Ich habe dieAngular-Dokumentationüber das Deployment mit Apache2 und die Dokumentation von Apache2sRegel neu schreibenUndUmschreibenCondAnweisungen. Das habe ich in meiner sites-available/mypage.conf. Alles im Directory-Tag ist ein modifiziertes Copypaste aus angular.io:
DocumentRoot /path/to/frontendfolder
#DocumentRoot is not a typo, I'm not sure if DOCUMENT_ROOT calls that variable or not,
#but there is nothing else called like it in neither the mypage.conf file, nor
#apache2.conf, nor envvars
Alias /prefix /path/to/frontendfolder
Alias /prefix/ /path/to/frontendfolder/index.html
<Directory /path/to/frontendfolder>
Require all granted
RewriteEngine On
# If an existing asset or directory is requested go to it as it is
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -f [OR]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -d
RewriteRule ^/prefix - [L]
# If the requested resource doesn't exist, use index.html
RewriteRule ^/prefix /index.html
</Directory>
Dadurch kann ich zumindest meine index.html laden, wenn ich auf meiner mypage.com/prefix
URL bin. Wenn ich mypage.com/prefix/page1 aufrufe und auf „Aktualisieren“ klicke, erhalte ich die Meldung „404 Nicht gefunden“ von Apache.
Was ist mit meiner Konfiguration nicht in Ordnung? Ich hatte den Eindruck, dass RewriteRule ^/prefix /index.html
alles, was mit /prefix beginnt, an meine index.html weitergeleitet wird, sofern diese URL nicht zu einer gültigen Datei führt. Warum passiert das also nicht?
Antwort1
Ihre Konfiguration scheint – bitte verzeihen Sie mir – verwirrend.
Richtig,Dokument Rootist kein Tippfehler. Es ist eine grundlegende Apache-Anweisung, die den URL-Bereich in Ihr Dateisystem abbildet. Sie teilt Apache also mit, wohin Anfragen beantwortet werden sollen, es sei denn, Sie überschreiben sie mit Alias, RewriteRule oder etwas anderem.
Ich bin mir nicht sicher, welche URL-Raumzuordnung Sie genau erreichen möchten. Mein bester Rat ist, zunächst alle Alias
und RewriteRule
-Anweisungen zu entfernen und nur die zu belassen DocumentRoot
. Prüfen Sie dann, ob Sie dadurch die gewünschte URL-Zuordnung erhalten. Zum Beispiel mit nur
DocumentRoot /path/to/frontendfolder
dann example.com/prefix
werden Anfragen an in Ihrem Dateisystem weitergeleitet /path/to/frontendfolder/prefix
. Wenn das ein Verzeichnis ist und es beispielsweise eine Datei index.html enthält, dann wird die Anfrage von beantwortet /path/to/frontendfolder/prefix/index.html
.
Das ist der Ausgangspunkt. Wenn es Ihren Anforderungen nicht entspricht, können Sie beginnen, es bei Bedarf zu überschreiben, mitAliasund RewriteRule-Direktiven. Alias ist einfacher und grundlegender, also versuchen Sie es zuerst zu verwenden und greifen Sie bei komplexeren Anforderungen auf RewriteRule zurück.
Viel Glück!
Obwohl in der Dokumentation zu RewriteCond erwähnt wird DOCUMENT_ROOT
, wird nicht angegeben, welcher Wert es ist. Wir können jedoch davon ausgehen, dass es sich um den Wert der DocumentRoot-Direktive handelt.