2017-02-12 54 views
2

我正在使用.htaccess删除我的网站上的.php扩展名。但在某些情况下,它会显示“内部服务器错误”。重写URL以删除扩展名时发生内部服务器错误.htaccess

这里是我的.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 

来重写这些URL删除PHP扩展的代码是最后三行。

假设我有一个文件夹,名为directory和一个名为根文件夹about.php

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

我该如何解决这个问题?我已经尝试了一切!

+0

检查你的错误日志,看看错误是什么。 – SuperDuperApps

回答

1

当您调试时,例如设置LogLevel debug rewrite:trace2,你会看到该请求/about/改写为/about/.php,并再次/about/.php.php,并再次/about/.php.php.php,依此类推,直到最终失败,

AH00124:请求超过了10个内部重定向极限由于可能的配置错误。

您可以通过附加规则来防止这种情况,该规则考虑了尾部斜线。此规则与您已有的规则大致相同

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

唯一的区别是规则模式中的尾部斜线。这将重写请求/about//about.php而不是/about/.php,因此找到正确的脚本而不是循环。


如果你想最小化规则的数量,例如,只有一个,而不是这两个规则,你也可以尝试这个稍微修改模式

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

这种模式同时匹配​​和/about/,这样一来你就一气呵成。

+0

对我来说完美的作品,这应该是被接受的答案。谢谢Olaf! – Silas