Ich habe eine eckige Anwendung mit mehreren Routen, wie zum Beispiel:
site.com/
site.com/page
site.com/page/4
Wenn Sie den HTML5-Routing-Modus von Angular verwenden, werden diese korrekt aufgelöst, wenn Sie in der Anwendung auf Links zu ihnen klicken. Bei einer harten Aktualisierung treten jedoch natürlich 404 Fehler auf. Um dies zu beheben, habe ich versucht, ein grundlegendes htaccess-Umschreiben zu implementieren.
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_METHOD} !OPTIONS
RewriteRule ^(.*)$ index.html [L]
Dies funktioniert jedoch für die Winkelanforderungen, wenn ich versuche, Skripte zu laden oder Ajax-Aufrufe in meiner Domäne zu tätigen, z.
<script src="/app/programs/script.js"></script>
Dieses Skript wird nicht geladen - die Anforderung wird umgeleitet und es wird versucht, die Seite index.html zu laden, da der .htaccess der Ansicht ist, dass die Anforderung umgeleitet werden sollte - ohne zu wissen, dass diese Datei vorhanden ist, und die Datei anstelle der Umleitung zu laden.
Gibt es eine Möglichkeit, dass der htaccess die Anforderung nur dann an index.html (mit den Ansichtsparametern) umleitet, wenn es keine tatsächliche Datei gibt, in die aufgelöst werden soll?
/app/programs/script.js
eine gültige Datei?Antworten:
Verwenden Sie einen Ausschnitt wie:
RewriteEngine on RewriteCond %{REQUEST_FILENAME} -s [OR] RewriteCond %{REQUEST_FILENAME} -l [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^.*$ - [NC,L] RewriteRule ^(.*) /index.html [NC,L]
Dies springt zur eigentlichen Ressource, falls vorhanden, und zu
index.html
allen AngularJS-Routen.quelle
http://www.domain.com/dashboard
. Also die URL hat/dashboard
dann nur ich möchte das Winkelprojekt öffnen. Bitte helfen Sie mir, wie man.htaccess
für dasselbe schreibt . Eigentlich habe ich 2 verschiedene Winkelprojekte. 1. wird gerenderthttp://www.domain.com
und 2. sollte weiterlaufenhttp://www.domain.com/dashboard
.Es liegt ein Problem vor, wenn die App eine
directive
Vorlagendatei angefordert hat , die Datei jedoch fehlt . In einigen Fällen verursachte es App angefordert mehrere Skriptdatei in derindex.html
.Wir sollten eine
404
Antwort anstelle einerindex.html
Datei senden, wenn die Datei nicht vorhanden ist. Also füge ich ein einfaches Regex-Muster hinzu, um fehlende Dateianforderungen zu identifizieren.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 ^ - [L] # If the requested pattern is file and file doesn't exist, send 404 RewriteCond %{REQUEST_URI} ^(\/[a-z_\-\s0-9\.]+)+\.[a-zA-Z]{2,4}$ RewriteRule ^ - [L,R=404] # otherwise use history router RewriteRule ^ /index.html
quelle
RewriteRule ^ - [L,R=404]
kann ich sie dann mithilfe vonRewriteRule ^ /index.html
oder auf index.html umleitenRewriteRule ^ - [L,R=/index.html]
? Ich bin in einer Appserver-Umgebung und die Pfade brechen ziemlich oft. Nicht an solche Änderungen in .htaccess gewöhnt, sondern nur 404 nach index.html umleiten..htaccess
Ansatz ist für das Fehlen einer Asset- / Vorlagendatei in eckigen Anweisungen vorgesehen, nicht für das Fehlen eines Pfads. Wenn Sie den fehlenden Pfad behandeln möchten, sollten Sie den Router-Anbieter selbst konfigurieren oder Router-Ereignisse verwenden.%{DOCUMENT_ROOT}
in der RewriteCond verwendet wird und die erforderlich ist, wenn Sie sich in einem VirtualHost befinden - andernfalls ist die Bedingung niemals erfüllt!Die Lösung eines armen Mannes (ohne mod_rewrite):
ErrorDocument 404 /index.html
quelle
In meinem Fall erstelle ich eine .htaccess-Datei wie unten
RewriteEngine on RewriteCond %{REQUEST_FILENAME} -s [OR] RewriteCond %{REQUEST_FILENAME} -l [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^.*$ - [NC,L] RewriteRule ^(.*) ./index.html [NC,L]
gerade hinzugefügt . vor /index.html und fügen Sie diese Datei in meiner Domain wie https://example.com/subfolder hinzu und es funktioniert gut
quelle
Überprüfen Sie diesen Link: https://stackoverflow.com/a/49455101/5899936 Erstellen Sie eine
.htaccess
Datei im Stammordner und fügen Sie diese in den Ordner ein.htaccess
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index\.html$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.html [L] </IfModule>
quelle
RewriteBase /SubDir
stattRewriteBase /
Ich werde eine weitere detaillierte htaccess-Datei bereitstellen, falls Sie Folgendes benötigen:
Hier ist mein Erfolg, sehr nah, aber genauer:
DirectoryIndex index.html RewriteEngine on RewriteBase /subDir RewriteCond %{REQUEST_FILENAME} -s [OR] RewriteCond %{REQUEST_FILENAME} -l [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^.*$ - [NC,L] RewriteRule ^(.*) index.html [NC,L]
quelle
In meinem Fall brauchten wir eine
.htaccess
Konfiguration mit mehr Funktionen , wie zum Beispiel:Authorization
Headers in eineHTTP_AUTHORIZATION
Umgebungsvariable.# If mod_rewrite is not present. <IfModule !mod_rewrite.c> FallbackResource /index.html </IfModule> <IfModule mod_rewrite.c> RewriteEngine On # Prefix for all rewritten routes ("index.html" gets "/index.html"). RewriteBase / # Redirects to HTTPS protocol (once uncommented). # # RewriteCond %{HTTPS} !on # RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L] # Make sure Authorization HTTP header is available. RewriteRule ^ - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] # Allows access to existing files or dirs. RewriteCond %{REQUEST_FILENAME} -s [OR] RewriteCond %{REQUEST_FILENAME} -l [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^.*$ - [NC,L] # Prevents treating the main-script as a route. RewriteRule ^index\.html$ - [L] # Redirect anything else to main-script RewriteRule ^(.*) index.html [NC,L] </IfModule> # Enable Cross-Origin Resource Sharing (CORS) # <IfModule mod_headers.c> Header merge Vary Origin # Allows any origin (just like "*", but works in more cases) SetEnvIf Origin "^(http(s)?://[^/:]*(?::\d{1,5})?)?" REQUEST_ORIGIN=$1 Header always append Access-Control-Allow-Origin %{REQUEST_ORIGIN}e env=REQUEST_ORIGIN Header always set Access-Control-Allow-Credentials "true" Header always set Access-Control-Allow-Methods "GET, POST, PUT, DELETE" Header always set Access-Control-Allow-Headers "*" Header always set Access-Control-Expose-Headers "*" </IfModule> # Disables Browser caching for production (edit pattern as you wish). # #<FilesMatch "\.(html|htm|js|json|css)$"> # <IfModule mod_headers.c> # FileETag None # Header unset ETag # Header unset Pragma # Header unset Cache-Control # Header unset Last-Modified # Header set Pragma "no-cache" # Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate" # Header set Expires "Mon, 10 Apr 1972 00:00:00 GMT" # </IfModule> #</FilesMatch>
Hinweis: Wir verwenden
[L]
stattdessen,[L,R=301]
da letzteres dazu führt, dass der Browser Weiterleitungen dauerhaft zwischenspeichert (und selbst wenn diese Route eines Tages eine Datei ist, wird sie trotzdem umgeleitet).quelle