Erreur de serveur interne lors de la réécriture de l’URL pour supprimer l’extension .htaccess

J’utilise .htaccess pour supprimer l’extension .php sur mon site. Mais dans certains cas, il est dit “Erreur interne du serveur”.

Voici mon code .htaccess:

AddHandler x-httpd-php5-6 .php Options +FollowSymLinks RewriteEngine on RewriteRule productos/(.+)/? /prueba/listado-productos.php?category=$1 RewriteRule productos/(.+)/(.+)/? /prueba/listado-productos.php?category=$1&subCategory=$2 RewriteRule productos/(.+)/(.+)/(.+)/? /prueba/listado-productos.php?category=$1&subCategory=$2&product=$3 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}\.php -f RewriteRule ^(.*)$ $1.php 

Le code pour réécrire les URL pour supprimer l’extension .php sont les trois dernières lignes.

Supposons que je possède un dossier appelé directory et un fichier appelé about.php dans le dossier racine:

 example.com -----> works example.com/directory ----> works example.com/directory/ ----> works example.com/about ----> works example.com/about/ ----> internal server error 

Comment puis-je réparer cela? J’ai tout essayé!

Lorsque vous déboguez ceci, par exemple, définissez LogLevel debug rewrite:trace2 , vous verrez que la requête /about/ est réécrite dans /about/.php , et de nouveau dans /about/.php.php , et de nouveau dans /about/.php.php.php , et ainsi de suite jusqu’à ce qu’il échoue avec

AH00124: La demande a dépassé la limite de 10 redirections internes en raison d’une erreur de configuration probable.

Vous pouvez empêcher cela avec une règle supplémentaire, qui considère la barre oblique finale. Cette règle est plus ou moins la même que vous avez déjà

 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}\.php -f RewriteRule ^(.*)/$ $1.php [L] 

La seule différence est la barre oblique dans le motif de la règle. Cela réécrira la requête /about/ à /about.php au lieu de /about/.php , et trouvera donc le script approprié au lieu de boucler.


Si vous souhaitez minimiser le nombre de règles, par exemple une seule au lieu de ces deux règles, vous pouvez également essayer ce motif légèrement modifié.

 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}\.php -f RewriteRule ^(.*?)/?$ $1.php [L] 

Ce modèle correspond à la fois /about et /about/ , et de cette manière, vous l’avez en une seule fois.