2016-06-12 110 views
0

我正在用PHP写一个CMS,所以我希望允许用户在不中断应用程序的情况下更改根文件夹的名称。我目前正在尝试使用特定于目录的.htaccess文件为自定义错误页面设置一些文件处理。我的文件树相对如下:ErrorDocument和.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的替代选项?提前致谢!

p.s. .htaccess文件和error_pages文件夹必须保留在其各自的目录中,以防用户想要创建多个cms安装,所有特定于安装的信息必须包含在其中的一个文件夹(本例中为'cms')文件夹中。这是另一个警告,为什么该文件夹必须能够改变名称而不会中断。

回答

1

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

ErrorDocument指令的语法是:

的ErrorDocument < 3位数代码 > < 动作>

其中动作将被视为:

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

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

  3. 显示文本为 (如果以上都不是)。该文本必须用引号引用 (“),如果它由多个单词。

但是,如果你读的文档中进一步下跌,这听起来像你可以传递更多的数据到重定向的URL:

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

为了达到这个目的,当发送错误重定向时,会设置额外的环境变量,这些环境变量将通过将'REDIRECT_'添加到原始标题名称中而从提供给原始请求的标题中生成。这为错误文档提供了原始请求的上下文。

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

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

+1

谢谢你的回答,这是一个耻辱,没有这样做的本地方法,但我想我可能只需要提供一个额外的文件,我希望没有其他文件,但如果它是唯一的选择,那么我想这是唯一的选择。再次感谢! –

0

您可以在服务器的根目录使用的的ErrorDocument一个PHP文件,像这样

的ErrorDocument 404 /404.php

广场/404.php因为它会用于所有404处理。

404.php文件将读取请求的路径,请检查是否路径是一个子目录,如果是这样,你可以使用包括重定向要么显示一些内容或者将用户重定向到子目录中的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 --> 

使用包含的好处是,你可以提供你想要的任何内容,它可能是一个更流畅的用户体验。您可能更愿意使用重定向将用户路由回子目录逻辑。

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

相关问题