Sur la version dev d'un site LAMP (Apache 2.4 sous Debian 8.5), mes règles de réécriture Apache implémentent un concept de "liste blanche puis complète". Plus précisément, les images de images/
, les feuilles de style de css/
, le javascript de /js
et quelques fichiers nommés sont directement servis sous forme de fichiers statiques, et tous les autres. les requêtes vont sur index.php.
L'ensemble de règles se trouve dans le bloc <VirtualHost
du fichier .conf de ce site:
RewriteEngine on
RewriteCond "%{REQUEST_URI}" "!^(/index\.php|/robots\.txt|/favicon\.ico)$"
RewriteCond "%{REQUEST_URI}" "!^/images/(.*)\.(jpg|png|jpeg|gif)$"
RewriteCond "%{REQUEST_URI}" "!^/css/(.*)\.css$"
RewriteCond "%{REQUEST_URI}" "!^/js/(.*)\.js$"
RewriteRule ^(.*)$ /index.php/$1 [L]
Et cela fonctionne comme prévu. (Il est basé sur this SO Q & A et est adapté pour fonctionner dans la configuration centrale plutôt que dans .htaccess
.)
Le problème est que le serveur de test (Ubuntu 16.04) doit imiter la production et que celle-ci nécessite l'utilisation de .htaccess
à la place de la configuration centrale. Cet ensemble de règles ne fonctionne pas dans .htaccess
. La question est donc de savoir comment obtenir le même effet dans .htaccess
.
J'ai activé AllowOverride all
dans le bloc <Directory /srv/www/site1>
dans Apache2.conf et j'ai placé un fichier .htaccess
dans /srv/www/site1
(qui est la valeur DocumentRoot
de ce site). Et basé sur cette documentation Apache , les barres obliques initiales supprimées des chemins et des noms de fichiers dans les conditions. Mettez également LogLevel info rewrite:trace8
dans la définition de VH pour résoudre ce problème.
Voici le .htaccess actuel:
Options -Indexes +FollowSymLinks
AddDefaultCharset UTF-8
RewriteEngine on
# RewriteBase "/"
# AccepthPathInfo on
RewriteCond "%{REQUEST_URI}" "!^(robots\.txt|favicon\.ico|css\/styles\.css)$"
RewriteCond "%{REQUEST_URI}" "!^index\.php"
RewriteCond "%{REQUEST_URI}" "!^css/(.*)\.css$"
RewriteCond "%{REQUEST_URI}" "!^images/(.*)\.(jpg|png|jpeg|gif)$"
RewriteCond "%{REQUEST_URI}" "!^js/(.*)\.js$"
RewriteRule ^(.*)$ /index.php/$1 [L]
Et obtenant http 500. Le journal des erreurs Apache montre qu'il boucle les règles jusqu'à atteindre une limite de redirection, et crée un mauvais chemin comme "index.php/index.php/index.php/..."
J'ai trouvé un très grand nombre de pages sur la réécriture d'URL, mais peu sont utiles à cet égard.
EDIT: résolu par w3dk - merci! Appliqué la solution ci-dessous et corrigé l’orthographe de "AcceptPathInfo", cela fonctionne.
RewriteEngine on RewriteCond "%{REQUEST_URI}" "!^(/index\.php|/robots\.txt|/favicon\.ico)$" RewriteCond "%{REQUEST_URI}" "!^/images/(.*)\.(jpg|png|jpeg|gif)$" RewriteCond "%{REQUEST_URI}" "!^/css/(.*)\.css$" RewriteCond "%{REQUEST_URI}" "!^/js/(.*)\.js$" RewriteRule ^(.*)$ /index.php/$1 [L]
Le format de vos directives initiales est également correct pour .htaccess
. Cependant, dans .htaccess
, vous aurez besoin d'une condition supplémentaire pour empêcher une boucle de réécriture après la réécriture sur index.php
.
RewriteCond "%{REQUEST_URI}" "!^index\.php"
Je vois que vous avez essayé de le faire dans votre deuxième bloc de code, cependant, la valeur de REQUEST_URI
est la même si vous codez directement dans la configuration du serveur ou dans .htaccess
- il commence toujours par une barre oblique. Ainsi, la condition ci-dessus annulée sera toujours vraie (comme toutes les autres conditions du deuxième bloc) et la RewriteRule
est donc toujours traitée.
Cependant, vous pouvez simplement ajouter un autre RewriteRule
au début de votre premier bloc de code:
RewriteRule ^index\.php - [L]
Donc, ensemble, cela devient:
RewriteEngine on
RewriteRule ^index\.php - [L]
RewriteCond "%{REQUEST_URI}" "!^(/index\.php|/robots\.txt|/favicon\.ico)$"
RewriteCond "%{REQUEST_URI}" "!^/images/(.*)\.(jpg|png|jpeg|gif)$"
RewriteCond "%{REQUEST_URI}" "!^/css/(.*)\.css$"
RewriteCond "%{REQUEST_URI}" "!^/js/(.*)\.js$"
RewriteRule ^(.*)$ /index.php/$1 [L]
# AccepthPathInfo on
Et AcceptPathInfo
devra être activé s'il ne l'est pas déjà.