web-dev-qa-db-fra.com

Apache RewriteRule ne redirige pas

J'ai ceci dans mon fichier .htaccess:

RewriteEngine on

RewriteRule ^images/chart\.png$    /static/images/chart.png    [L,R=301]
RewriteRule ^images/artwork/(.+).png   /static/artwork/$1.jpg  [L,R=301]

# codeigniter
RewriteCond $1 !^(index\.php|static|images|admin|user_guide|sitemap\.xml\.gz|robots\.txt)
RewriteRule ^(.*)$ /index.php/$1 [L]

La partie CodeIgniter doit ignorer les dossiers images et static. Cependant, lorsque j’ouvre example.com/images/chart.png j’obtiens la page CI 404. L'autre redirection 301 fonctionne correctement.

Vous ne pouvez pas comprendre celui-ci, quelqu'un a-t-il une idée?

3
DisgruntledGoat

J'ai finalement résolu le problème moi-même en supprimant le répertoire images de la clause CI RewriteCond. (Toujours pas tout à fait sûr pourquoi cela a fonctionné parce que la demande de images/chart.png n'aurait pas dû arriver à la partie CI.)

0
DisgruntledGoat

Ce qui se passe ici, c’est que votre réécriture fonctionne réellement, mais que R = 301 provoque une deuxième itération qui provoque la 404.

La demande arrive pour images/chart.png et vos règles de réécriture vont au travail. Lorsque cela correspond sur votre première règle, une redirection 301 est générée. Cette redirection 301 indique au navigateur d'émettre une nouvelle demande pour /static/images/chart.png.

La nouvelle demande parvient donc à votre serveur et les règles de réécriture sont exécutées à nouveau. Cette fois, la demande ne correspond pas à vos règles personnalisées en haut et en fait une règle CodeIgniter. Puisque votre nouvelle URL commence par "statique", elle correspond à la règle de CI et redirige vers /index.php?/static/images/chart.png. Puisque CI ne sait pas comment gérer cela (je suppose), il jette le 404 pour informer l'utilisateur qu'il ne peut pas trouver la ressource.

Ce que vous allez faire est de mettre à jour la règle de CI pour ajouter les conditions suivantes:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

Ceci indiquera à mod_rewrite de n'exécuter la règle que si la demande ne concerne pas un fichier littéralement existant (!-f) ou un répertoire (!-d).

Une fois cette mise à jour effectuée, la première règle entraînera la même redirection pour /static/images/chart.png, mais comme ce fichier existe littéralement sur ce chemin, les règles de l'IC le laisseront en place et aucune nouvelle réécriture ne sera effectuée. Le serveur servira alors l'image normalement.

0
AgentConundrum