web-dev-qa-db-fra.com

htaccess redirect pour Angular routes

J'ai une application angular avec plusieurs routes, telles que:

site.com/
site.com/page
site.com/page/4

En utilisant le mode de routage html5 d'angular, ces problèmes sont résolus correctement lorsque vous cliquez sur les liens qui les unissent depuis l'application, mais il existe bien entendu des erreurs 404 lors d'une actualisation forcée. Pour résoudre ce problème, j'ai essayé d'implémenter une réécriture htaccess de base.

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_METHOD} !OPTIONS
RewriteRule ^(.*)$ index.html [L]

Ceci fonctionne pour les requêtes angular, cependant, lorsque j'essaie de charger des scripts ou de passer des appels ajax dans mon domaine, telles que:

<script src="/app/programs/script.js"></script>

Ce script ne se charge pas - sa requête est redirigée et il tente de charger la page index.html car le .htaccess pense qu'il devrait rediriger la requête - ne sachant pas que ce fichier existe et doit le charger à la place de la redirection.

Htaccess peut-il rediriger la demande vers index.html (avec les paramètres de vue) uniquement s’il n’ya pas de fichier réel à résoudre?

60
Lucas Penney

Utilisez un extrait tel que:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]

RewriteRule ^(.*) /index.html [NC,L]

Cela passera à la ressource réelle s'il en existe une, et à index.html pour tous les itinéraires AngularJS.

126
rajasaur

Il y a un problème si l'application demandée directive modèle de fichier, mais fichier manquant. Dans certains cas, l'application multiple demandée par l'application dans le fichier index.html.

nous devrions envoyer 404 réponse au lieu de index.html fichier si le fichier n'existe pas. J'ajoute donc un motif regex simple pour identifier la demande de fichier manquante.

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
20
port115

La solution d'un homme pauvre (n'utilisant pas mod_rewrite):

ErrorDocument 404 /index.html
5
Cito

Dans mon cas, je crée un fichier .htaccess comme ci-dessous

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]

RewriteRule ^(.*) ./index.html [NC,L]

vient d'être ajouté. avant /index.html et ajoutez ce fichier dans mon domaine comme https://example.com/subfolder et cela fonctionne bien

3
Sachin from Pune

Consultez ce lien: https://stackoverflow.com/a/49455101/5899936 Créer .htaccess fichier dans le dossier racine et le coller dans le fichier .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>
2
Sumit Jaiswal

Je fournirai un autre fichier htaccess détaillé au cas où vous auriez besoin de:

  • Considérer le fichier d'index baseUrl et par défaut
  • Supprimez la barre oblique à gérer: params

Voici mon htaccess, très proche, mais plus spécifique:

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]
0
andrea06590