web-dev-qa-db-fra.com

Jeu de règles de réécriture apache pour "liste blanche ou attrape" dans .htaccess

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.

2
stephen_789
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à.

1
MrWhite