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?
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.
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
La solution d'un homme pauvre (n'utilisant pas mod_rewrite):
ErrorDocument 404 /index.html
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
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>
Je fournirai un autre fichier htaccess détaillé au cas où vous auriez besoin de:
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]