使用.htaccess缩短URL出现内部服务器错误,求排查解决
问题分析与解决办法
为什么会出现500错误?
你的规则犯了两个核心错误:
- 逻辑完全搞反:当前规则是「只要请求的文件/目录存在,就强制重写到
app/Views/$1」,这会触发无限循环——比如访问根目录时,根目录存在,规则把请求转到app/Views/,而这个新请求又会再次触发规则,反复循环直到服务器返回500错误。 - 大小写不匹配:你的实际文件目录是
app/views/(小写v),但规则里写的是app/Views/(大写V),如果服务器是Linux这类区分大小写的系统,会直接找不到目标文件。
正确的.htaccess配置
情况1:保留.php后缀(比如www.site.com/accessories.php)
把规则改成「当请求的文件/目录不存在时,才去app/views/下找对应文件」,同时排除app目录本身,避免干扰:
RewriteEngine On # 排除实际存在的app目录,避免被重写 RewriteRule ^app/ - [L] # 当请求的文件/目录不存在时,重写到app/views/下 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ app/views/$1 [NC,QSA,L]
情况2:去掉.php后缀(比如www.site.com/accessories)
如果想实现不带.php的简洁URL,在上面的基础上再加一条规则:
RewriteEngine On # 排除实际存在的app目录 RewriteRule ^app/ - [L] # 处理不带.php的URL:把请求转成对应.php文件 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}.php -f RewriteRule ^(.*)$ app/views/$1.php [NC,QSA,L] # 兜底:如果上面的.php文件也不存在,再尝试原路径(可选) RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ app/views/$1 [NC,QSA,L]
注意事项
- 确保服务器开启了
mod_rewrite模块,否则规则无效。 - 如果是Windows服务器,大小写问题可能不明显,但建议保持目录名和规则一致,避免后续坑。
内容的提问来源于stack exchange,提问作者Tiago
相关产品推荐
相关产品推荐

