redirection htaccess pour les routes angulars

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, ceux-ci se résolvent correctement lorsque vous cliquez sur des liens vers eux depuis l’application, mais bien sûr, il y a 404 erreurs lorsque vous effectuez une actualisation matérielle. 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] 

Cela fonctionne pour les requêtes angulars, cependant lorsque j’essaie de charger des scripts ou de faire des appels ajax dans mon domaine, tels que:

  

Ce script ne se charge pas – sa requête est redirigée et il essaie de charger la page index.html car le fichier .htaccess pense qu’il doit réacheminer la requête – sans savoir que ce fichier existe et qu’il devrait charger le fichier au lieu de redirect.

Est-il possible que htaccess redirige la requête vers index.html (avec les parameters de la vue) uniquement s’il n’y a pas de fichier vers lequel résoudre le problème?

    Utilisez un extrait comme:

     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 permet de passer directement à la ressource si elle existe, et à index.html pour toutes les routes AngularJS.

    Il y a un problème si l’application a demandé un fichier de modèle de directive , mais le fichier est manquant . Dans certains cas, il a provoqué plusieurs fichiers script de l’application dans le index.html .

    nous devrions envoyer une réponse 404 au lieu du fichier index.html si le fichier n’existe pas. Donc, j’ajoute un modèle de 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 

    La solution d’un pauvre homme (sans mod_rewrite):

     ErrorDocument 404 /index.html 

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

    • Considérer le fichier baseUrl et le fichier d’index par défaut
    • Supprimez le slash principal pour 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] 

    Consultez ce lien: https://stackoverflow.com/a/49455101/5899936 Créez le fichier .htaccess dans le dossier racine et saisissez-le dans le fichier .htaccess

       RewriteEngine On RewriteBase / RewriteRule ^index\.html$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.html [L]  

    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’append . avant /index.html et append ce fichier dans mon domaine comme https://example.com/subfolder et ça marche bien