web-dev-qa-db-fra.com

réécrire les règles pour Apache 2 à utiliser avec js angulaire

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

  • app /
  • app/index.html (la "racine" de l'application js angulaire)
  • api (ce sera une application symfony 2 utilisée pour "api". J'enverrai des requêtes ajax vers et à partir d'angular.)

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.

16
Mike Haas

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]
14
Stewie

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> 
22
Scott Ferguson

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!

0
Adam Marr

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>
0
RajV