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.