【问题标题】:Mod_Rewrite Extension Removal Changes Functioning of 404Mod_Rewrite 扩展删除更改 404 的功能
【发布时间】:2012-04-09 12:07:00
【问题描述】:

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

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

理想情况下,我只想将我的用户重定向到自定义的“未找到页面”页面,但我目前无法找到执行此操作的方法。

这是我正在使用的代码:

Options -MultiViews

RewriteEngine On

RewriteBase /

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

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

所以,总而言之,有谁知道如何重写扩展,同时保持默认的“未找到页面”系统的相同功能?

【问题讨论】:

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


    【解决方案1】:

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

    如果您访问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错误页面。

    【讨论】:

    • drew010,你是对的,另一个答案很实用,因为它忽略了我的问题,但实际上并没有解决它。
    • 如果您检查您的 Apache error_log,您将看到 500 错误的确切原因。如果您的站点非常繁忙,您将大量写入错误日志并使其不必要地增长,这使得查找和调试实际错误变得更加困难。看看这是否也有帮助。
    • 感谢您的帮助,非常感谢。
    【解决方案2】:

    【讨论】:

    • 很棒的答案,我只需要将 ErrorDocument 500 /nope 替换为 ErrorDocument 500 http://path.com/to_nope
    • 您一开始就不应该收到 500 内部服务器错误。覆盖 500 错误页面是一种解决方法,但不能解决问题。
    猜你喜欢
    • 2014-10-09
    • 2015-06-29
    • 2013-10-11
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多