【问题标题】:ErrorDocument and .htaccessErrorDocument 和 .htaccess
【发布时间】:2016-10-12 16:53:24
【问题描述】:

我正在用 php 编写一个 CMS,所以我想允许用户在不破坏应用程序的情况下更改根文件夹的名称。我目前正在尝试使用特定于目录的 .htaccess 文件为自定义错误页面设置一些文件处理。我的文件树相对如下:

MAMP >
|   htdocs >
|   |   cms > 
|   |   |   .htaccess
|   |   |   index.php
|   |   |   cms_files >
|   |   |   |   info.json
|   |   |   |   . . . 
|   |   |   |   error_pages >
|   |   |   |   |   errors.php
|   |   |   |   |

而我标记为“cms”的文件夹应该可以修改。

所以我的问题是,在我的 .htaccess 文件中,我使用 ErrorDocument 404 /cms/cms_files/error_pages/errors.php,处理该文档中的错误代码,效果很好。但是,就像我说的,我需要能够在不破坏 ErrorDocument 文件路径的情况下更改“cms”的名称,并且从我所有的在线搜索中,我似乎找不到任何可以让我在.htaccess,相对于它当前所在的目录。

基本上我希望能够做类似的事情

ErrorDocument 404 CURRENT_DIRECTORY/cms_files/error_pages/errors.php

避免硬编码根文件夹。

有没有简单的方法可以做到这一点?或者也许只是使用 php 而不是 .htaccess 的替代选项?提前致谢!

附言.htaccess 文件和 error_pages 文件夹必须保留在各自的目录中,以防用户想要创建 cms 的多个安装,所有安装特定信息必须包含在一个(在本例中为“cms”)文件夹中。这是关于为什么文件夹必须能够更改名称而不破坏的另一个警告。

【问题讨论】:

    标签: php apache .htaccess errordocument


    【解决方案1】:

    根据 Apache 文档,似乎根本不支持相对路径:(https://httpd.apache.org/docs/2.4/custom-error.html)

    ErrorDocument 指令的语法是:

    ErrorDocument 3-digit-code> 动作>

    动作将被视为:

    1. 要重定向到的本地 URL(如果操作以“/”开头)。

    2. 要重定向到的外部 URL(如果操作是有效的 URL)。

    3. 文本是 显示(如果以上都不是)。文本必须用引号括起来 (") 如果它包含多个单词。

    但是,如果您进一步阅读文档,听起来您可以将其他数据传递给重定向的 URL:

    重定向到另一个 URL 可能很有用,但前提是可以传递一些信息,这些信息可以用来更清楚地解释或记录错误情况。

    为了实现这一点,当发送错误重定向时,将设置额外的环境变量,这些环境变量将从提供给原始请求的标头中生成,方法是在原始标头名称前加上“REDIRECT_”。这为错误文档提供了原始请求的上下文。

    阅读文档以获取所有可用的重定向信息。您可能会在那里找到有用的东西。

    也许您将所有 404 重定向到某种控制器,该控制器通过 PHP 将用户重定向到正确的 404 页面,给定额外的重定向信息。

    【讨论】:

    • 感谢您的回答,很遗憾没有本地方法可以做到这一点,但我想我可能只需要提供一个额外的文件,我希望不要有一个杂项文件,但如果它是唯一的选择,那么我想它是唯一的选择。再次感谢!
    【解决方案2】:

    您可以对 ErrorDocument 使用单个 PHP 文件,就像这样

    错误文档 404 /404.php

    /404.php 放在服务器文档根目录中,因为它将用于所有 404 处理。

    404.php 文件将读取请求的路径,检查路径是否为子目录,如果是,您可以使用 include重定向 以显示一些内容或将用户重定向到子目录中的 404.php 页面。

    <?php
    // Get the path that was requested
    $pathComponents = explode('/',$_SERVER['REQUEST_URI']);
    
    // The first element on the path is the directory of interest
    $baseDirRequested = $pathComponents[0];
    
    // If the directory exists, either include or redirect to that 404 file
    if (is_dir($baseDirRequested)) {
            // Include
            include $baseDirRequested.'/404.php';
            // -- or --
            // Redirect
            header('Location: '.$baseDirRequested.'/404.php');
            exit;
    } else {
            echo 'You are really lost';
    }
    

    在子目录404.php

    <?php 
    // 404 for search engines 
    header("HTTP/1.1 404 Not Found"); 
    ?>
    <!-- HTML for people -->
    

    使用包含的优点是您可以提供任何您想要的内容,这可能是一种更流畅的用户体验。您可能更喜欢使用重定向将用户路由回子目录逻辑。

    我没有测试过,可能需要一些调整。

    【讨论】:

      猜你喜欢
      • 2023-03-28
      • 2013-09-13
      • 2012-08-25
      • 2013-05-12
      • 2014-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多