我正在用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' )文件夹。这是另一个警告,为什么文件夹必须能够更改名称而不会破坏。
答案 0 :(得分:1)
根据Apache文档,看起来似乎不支持相对路径:(https://httpd.apache.org/docs/2.4/custom-error.html)
ErrorDocument指令的语法是:
ErrorDocument< 3位代码> < 动作>
将操作视为:
要重定向到的本地网址(如果操作以“/”开头)。
要重定向到的外部URL(如果操作是有效的URL)。
- 醇>
要发送的文字 显示(如果没有以上)。文本必须用引号括起来 (“)如果它由多个单词组成。
但是,如果您在文档中进一步阅读,听起来您可以将其他数据传递到重定向的网址:
重定向到另一个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';
}
使用包含的优点是您可以提供您想要的任何内容,这可能是更流畅的用户体验。您可能更喜欢使用重定向将用户路由回子目录逻辑。
我没有对此进行测试,可能需要进行一些调整。