Apache2 ne fonctionne pas avec les itinéraires PHP

Je développe une application avec PHP 7.0 et implémente des routes avec MVC. Mon dossier racine (‘/’) est le répertoire ‘public’. Lorsque j’accède à l’adresse ‘localhost’, je suis redirigé vers index.php avec les itinéraires disponibles. Mais quand j’essaie une autre URL pour accéder à une autre route, comme ‘localhost / contact’, le serveur ne trouve pas l’entrée et donne ce message:

Not Found The requested URL /contact was not found on this server. 

Je suis à peu près sûr que le problème est sur la configuration de mon serveur (apache2 sur Linux mint 18), car le PC de mon ami fonctionne normalement. J’utilise aussi un fichier .htaccess dans le répertoire public:

 RewriteEngine On RewriteCond %{REQUEST_FILENAME} -s [OR] RewriteCond %{REQUEST_FILENAME} -l [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^.*$ - [NC,L] RewriteRule ^.*$ index.php [NC,L] 

Il me semble que le serveur ne lance pas index.php et tente d’accéder au chemin. Comment pourrais-je forcer l’exécution de index.php pour voir s’il y a une route vers l’url informée?

ici suit mes fichiers de configuration apache2.

http://pastebin.fr/2mgSjWWV

http://pastebin.com/yD4RpfK8

Je suis toujours newbee et je comprends très peu la configuration du serveur. S’il vous plaît quelqu’un peut me donner une lumière? Merci!

Ce:

 RewriteRule ^.*$ - [NC,L] 

Il correspond à TOUT, et comme il est marqué [L] , aucune autre RewriteRules ne sera évaluée, donc toute réécriture s’arrête ici. Cela signifie qu’une demande pour example.com/foo correspondra à cette règle, la réécriture s’arrête et un fichier foo littéral sera recherché dans le système de fichiers – ce qui n’existe pas.

Et puis, même si cette règle n’était pas là, cette ligne suivante

 RewriteRule ^.*$ index.php [NC,L] 

ne fonctionnerait pas aussi. N’IMPORTE QUELLE URL correspondrait à celle-ci, mais retirait ensuite les données pertinentes, de sorte qu’une demande pour example.com/foo serait identique à une demande pour example.com/index.php . aucun paramètre de requête ne serait transmis.

Votre logique devrait ressembler davantage à:

 RewriteRule ^(.*)$ index.php?args=$1 [QSA,L] 

qui ferait ce genre de traductions:

 example.com/foo -> example.com/index.php?args=foo example.com/bar?baz -> example.com/index.php?args=bar&baz 

Après une batterie de tests exhaustive, j’ai trouvé une solution. Le fichier et le code htaccess étaient corrects. Le problème était que mon serveur ne lisait pas le .htaccess. L’édition du fichier apache2.conf et la configuration de ‘AllowOverride All’ sont enfin activées.

Cette page https://docs.bolt.cm/3.0/howto/making-sure-htaccess-works m’aide à résoudre ce problème!