ErrorDocument和.htaccess

时间:2016-06-12 01:35:42

标签: php apache .htaccess errordocument

我正在用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,处理该文档中的错误代码,该工作正常。但是,就像我说的,我需要能够更改“cms'”的名称。在没有打破ErrorDocument文件路径的情况下,从我在网上的所有搜索中,我似乎无法找到任何允许我在.htaccess中设置相对于其当前所在目录的相对路径的内容。

基本上我希望能够做类似

的事情
ErrorDocument 404 CURRENT_DIRECTORY/cms_files/error_pages/errors.php

避免硬编码根文件夹。

有没有简单的方法呢?或者使用php而不是.htaccess的备用选项?提前谢谢!

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

2 个答案:

答案 0 :(得分:1)

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

  

ErrorDocument指令的语法是:

     

ErrorDocument< 3位代码> < 动作>

     

将操作视为:

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

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

  4.   
  5. 要发送的文字   显示(如果没有以上)。文本必须用引号括起来   (“)如果它由多个单词组成。

  6.   

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

  

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

     

为实现此目的,当发送错误重定向时,将设置其他环境变量,这些变量将通过将“REDIRECT_”添加到原始标题名称之前从提供给原始请求的标题生成。这为错误文档提供了原始请求的上下文。

阅读所有可用重定向信息的文档。你可能会发现一些有用的东西。

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

答案 1 :(得分:0)

您可以将单个PHP文件用于ErrorDocument,如此

  

ErrorDocument 404 /404.php

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

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

function replaceName(url){

    var match = /^\/\d+(\/.*)$/.exec(url);
    if(match){
        return match[1];
    }

}

在子目录 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';
}

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

我没有对此进行测试,可能需要进行一些调整。