Mod_Rewrite扩展删除更改功能404

时间:2012-03-25 21:58:51

标签: php apache .htaccess mod-rewrite url-rewriting

当我尝试使用我的Apache服务器上的.htaccess文件从我的所有文件中删除我的PHP扩展时,一切都很好。删除了扩展,一切看起来都好多了。

但是,我遇到一个小问题:当我通常会转到./nonexistent.php等页面时,我会收到404错误。但是,当我重写我的网址时,我转到./nonexistent,而是获得了500 Internal Server Error

理想情况下,我想简单地将用户重定向到自定义的“找不到页面”页面,但我目前无法找到实现此目的的方法。

这是我正在使用的代码:

Options -MultiViews

RewriteEngine On

RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ $1.php

我已尝试设置:ErrorDocument 500 /nope,但是,这似乎也没有效果。

因此,总而言之,是否有人知道如何重写扩展,同时保持默认的'Page Not Found'系统的相同功能?

2 个答案:

答案 0 :(得分:2)

当您使用上述重写条件请求不存在的文件时,您将遇到无限重定向。

如果你访问http://yoursite.com/i-dont-exist,第一个条件是评估为真,i-dont-exist是一个不存在的文件,所以它会尝试重写为i-dont-exist.php,这也不存在,所以重写模式一直持续到Apache限制递归并给出500错误(基本上它会不断重写为i-dont-exist.php.php.php.php.php...php,直到遇到500错误。

您可以通过添加其他检查来解决此问题,以确保在重写之前存在.php扩展名的文件。

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f  #make sure $1.php exists before rewriting
RewriteRule ^(.*)$ $1.php

如果file.php存在,那么它将重写为它,否则它将不会,并且将提供404错误页面。

答案 1 :(得分:1)