De toute évidence, il y a beaucoup de discussions et de réponses sur la réécriture des mods sur tout le Web. Cependant, j'ai du mal à les saisir. Alors j'ai pensé que je demanderais ici.
Je demande des règles de réécriture pour faire ce que Andy Joslin a expliqué dans les commentaires ici: https://stackoverflow.com/a/11100438
Ceci est ma structure actuelle de dir à la racine de example.com
Je voudrais rediriger toutes les demandes vers app/index.html, à l'exception des demandes adressées à/api.
Par exemple:
http://example.com/categories/electronics/iPod serait en fait comme aller à http://example.com/app/index.html/categories/electronics/iPod
Je voudrais cependant que la partie app/index.html soit masquée.
Ensuite, il y aurait une exception pour les requêtes adressées à http://example.com/api car je devrai adresser des requêtes ajax à ces chemins d'URL.
Merci pour toute aide/conseils.
Voici quelque chose pour vous aider (mettez ceci dans votre fichier /.htaccess):
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]
La réponse acceptée à cette question est obsolète. Vous pouvez maintenant utiliser la directive FallbackResource dans votre fichier de configuration avec Apache 2.2.16+.
FallbackResource /app/index.html
Si vous souhaitez que la directive FallbackResource ignore les routes "/ api":
<Directory /api>
FallbackResource disabled
</Directory>
Le problème avec cette réponse est que vous voulez toujours 404 pour le fichier non trouvé. En fonction de la manière dont une personne crée son application frontale, il est très courant que les fichiers CSS ou d'autres fichiers soient renvoyés au format 404, en particulier s'ils développent des applications dynamiques plus volumineuses ou sous-traitent des tâches frontales. De plus, les routes angulaires ne sont généralement liées à aucun élément du système de fichiers. Ce qui précède peut fonctionner si vous le limitez à un seul répertoire. Par exemple, je vais souvent utiliser un préfixe commun pour toutes les routes angulaires qui n'est pas lié à la structure du système de fichiers (/ ajs /). Si vous pouvez faire
<Directory /ajs>
FallbackResource /app/index.html
</Directory>
Cela aurait alors plus de sens, mais cela ne semble pas fonctionner pour moi. L'utilisation d'un préfixe commun simplifie également les règles du backend, peu importe le backend. Par exemple, vous pouvez configurer un contrôleur de transfert de serveur simple si vous n'utilisez pas de proxy inverse. Et cela simplifie la modélisation de vos règles de réécriture Apache. Par exemple:
RewriteEngine On
RewriteRule ^/ajs/(.+)$ /index.html
Cela dit, je n’avais jamais vu la méthode directory/fallback auparavant, je suis donc intéressé à l’explorer lorsque la seule réécriture dont j’ai besoin est celle de l’avant angulaire. Merci!
Ceci est une légère variation et élaboration de l'excellente réponse de Scott Ferguson. Je trouve qu'il est plus facile d'utiliser la directive <Location>
que <Directory>
. La directive <Directory>
prend un nom de chemin absolu qui peut être différent selon les machines.
Supposons donc que votre index.html
de votre Angular _ se trouve dans my-app/index.html
sous la racine du document de votre serveur Web. Et vous souhaitez accéder à l'application à l'aide de http://localhost/my-app
.
Tout d’abord, assurez-vous que votre href de base est "/ my-app /". Ensuite, dans votre fichier httpd.conf
, ajoutez:
<Location "/my-app">
FallbackResource /my-app/index.html
</Location>
Cela entraînera Apache à charger index.html si aucune ressource sous /my-app/
ne peut être trouvée.
Si vous passez des appels d'API sous le même chemin, tel que par exemple /my-app/api
, vous ne devriez probablement pas appliquer la règle FallbackResource
à ces appels. Alors ajoutez:
<Location "/my-app/api">
FallbackResource disabled
</Location>