Offensichtlich gibt es im gesamten Internet viele Mod-Umschreibungsdiskussionen und Antworten. Es fällt mir jedoch schwer, sie zu erfassen. Also dachte ich ich würde hier fragen.
Ich bitte Sie, Regeln umzuschreiben, um das zu tun, was Andy Joslin in den Kommentaren hier erklärt hat: https://stackoverflow.com/a/11100438
Dies ist meine aktuelle Verzeichnisstruktur im Stammverzeichnis von example.com
Ich möchte alle Anforderungen an app/index.html umleiten, außer an/api.
Zum Beispiel:
http://example.com/categories/electronics/iPod wäre eigentlich wie http://example.com/app/index.html/categories/electronics/iPod
Ich möchte, dass der app/index.html-Teil jedoch ausgeblendet wird.
Dann gibt es eine Ausnahme für Anfragen an http://example.com/api , da ich Ajax-Anforderungen an diese URL-Pfade stellen muss.
Vielen Dank für jede Hilfe/Anleitung.
Hier ist etwas, um Sie zum Laufen zu bringen (fügen Sie dies in Ihre /.htaccess-Datei ein):
Options +FollowSymLinks
IndexIgnore */*
RewriteEngine on
# if a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteCond %{REQUEST_URI} !/api
# otherwise forward it to index.html
RewriteRule ^.*$ - [NC,L]
RewriteRule ^app/. /app/index.html [NC,L]
Die akzeptierte Antwort auf diese Frage ist veraltet. Sie können jetzt die Direktive FallbackResource in Ihrer conf-Datei mit Apache 2.2.16+ verwenden.
FallbackResource /app/index.html
Wenn Sie möchten, dass die FallbackResource-Direktive die "/ api" -Routen ignoriert:
<Directory /api>
FallbackResource disabled
</Directory>
Von meinem Produktionsserver:
<VirtualHost *:80>
ServerName XXX.com
DocumentRoot /home/www/XXX.com/www
# Local Tomcat server
<Location /api/>
ProxyPass http://localhost:8080/api/
ProxyPassReverse http://localhost:8080/api/
</Location>
RewriteEngine On
# If an existing asset or directory or API is requested go to it as it is
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -f [OR]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -d [OR]
RewriteCond %{REQUEST_URI} /api
RewriteRule ^ - [L]
# If the requested resource doesn't exist (and is not API), use index.html
RewriteRule ^ /index.html
ErrorLog logs/XXX.com-error.log
CustomLog logs/XXX.com-access.log common
</VirtualHost>
Bitte beachte, dass "!" vor "/ api" in der akzeptierten Antwort ist falsch.
Das Problem bei dieser Antwort ist, dass Sie immer noch 404s für die Datei nicht gefunden haben möchten. Je nachdem, wie eine Person ihre Front-End-Anwendung erstellt, ist es sehr üblich, dass Benutzer css oder andere Dateien erhalten (404), insbesondere wenn sie größere dynamische Anwendungen erstellen oder die Front-End-Arbeit auslagern. Außerdem beziehen sich Winkelrouten normalerweise nicht auf irgendetwas im Dateisystem. Das Obige funktioniert möglicherweise, wenn Sie es auf ein einzelnes Verzeichnis eingrenzen. Beispielsweise verwende ich häufig ein gemeinsames Präfix für alle Winkelrouten, das nicht mit dem Dateisystemlayout (/ ajs /) zusammenhängt. Wenn du das kannst
<Directory /ajs>
FallbackResource /app/index.html
</Directory>
Dann wäre es sinnvoller, aber das scheint für mich nicht zu funktionieren. Durch die Verwendung eines gemeinsamen Präfixes werden auch die Backend-Regeln unabhängig vom Backend wesentlich einfacher. Sie können beispielsweise einen einfachen Server-Forward-Controller einrichten, wenn Sie keinen Reverse-Proxy verwenden. Und es vereinfacht das Modellieren Ihrer Apache-Umschreibungsregeln. Zum Beispiel:
RewriteEngine On
RewriteRule ^/ajs/(.+)$ /index.html
Das heißt, ich habe die Verzeichnis-/Fallback-Methode noch nicht gesehen, also bin ich daran interessiert, sie zu erkunden, wenn ich nur die Neuschreibung für den Winkel nach vorne machen muss. Vielen Dank!
Dies ist eine leichte Abweichung und Ausarbeitung der hervorragenden Antwort von Scott Ferguson. Ich finde es einfacher, die <Location>
-Direktive zu verwenden als <Directory>
. Die <Directory>
-Direktive nimmt einen absoluten Pfadnamen an, der bei verschiedenen Maschinen unterschiedlich sein kann.
Nehmen wir an, Ihr Angular-App-_ index.html
_ befindet sich in my-app/index.html
unter dem Dokumentstammverzeichnis Ihres Webservers. Und Sie möchten mit http://localhost/my-app
auf die App zugreifen.
Stellen Sie zunächst sicher, dass Ihre Basis href "/ my-app /" ist. Als nächstes fügen Sie in Ihrer httpd.conf
-Datei Folgendes hinzu:
<Location "/my-app">
FallbackResource /my-app/index.html
</Location>
Dies führt dazu, dass Apache index.html lädt, wenn keine Ressource unter /my-app/
gefunden werden kann.
Wenn Sie API-Aufrufe unter demselben Pfad ausführen, z. B. /my-app/api
, sollten Sie die FallbackResource
-Regel wahrscheinlich nicht für diese Aufrufe anwenden. So fügen Sie hinzu:
<Location "/my-app/api">
FallbackResource disabled
</Location>