我正在用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')文件夹中。这是另一个警告,为什么文件夹必须能够更改名称而不破坏。
发布于 2016-06-12 02:22:54
根据Apache文档,相对路径似乎根本不受支持:(https://httpd.apache.org/docs/2.4/custom-error.html)
ErrorDocument指令的语法是: ErrorDocument <3位码> 该行动将被视为:
但是,如果您在文档中进一步阅读,听起来您可以将其他数据传递给重定向URL:
重定向到另一个URL可能很有用,但前提是可以传递一些信息,这些信息可以用来解释或更清楚地记录错误情况。 为此,在发送错误重定向时,将设置额外的环境变量,这些环境变量将通过将“REDIRECT_”放在原始标头名称前,从提供给原始请求的标头生成。这将提供错误文档--原始请求的上下文。
阅读所有重定向信息的文档。你可能会在那里找到有用的东西。
考虑到附加的重定向信息,也许您将所有404重定向到某种控制器,该控制器通过PHP将用户重定向到正确的404页。
发布于 2016-06-12 03:57:41
您可以为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 -->使用包含的优点是您可以提供您想要的任何内容,这可能是一个更顺畅的用户体验。您可能更喜欢使用重定向将用户路由回子目录逻辑。
我还没有测试这个,它可能需要一些调整。
https://stackoverflow.com/questions/37769960
复制相似问题