ErrorDocument и .htaccess

Я пишу CMS на php, поэтому я бы хотел, чтобы пользователи могли менять имя корневой папки, не нарушая работу приложения. В настоящее время я пытаюсь настроить обработку файлов для пользовательских страниц ошибок, используя мой специфичный для каталога файл .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? Заранее спасибо!

постскриптум Файл .htaccess и папка error_pages должны оставаться в своих соответствующих каталогах на тот случай, если пользователи захотят создать несколько установок cms, вся информация, относящаяся к установке, должна содержаться в одной (в данном случае, папке ‘cms’). Что является еще одним предупреждением о том, почему папка должна иметь возможность изменять имя без разрывов.

0

Решение

Согласно документации Apache, похоже, что относительные пути просто не поддерживаются 🙁https://httpd.apache.org/docs/2.4/custom-error.html)

Синтаксис директивы ErrorDocument:

ErrorDocument <3-значный код> <действие>

где действие будет рассматриваться как:

  1. Локальный URL для перенаправления (если действие начинается с «/»).

  2. Внешний URL-адрес для перенаправления (если действие является допустимым URL-адресом).

  3. Текст будет
    отображается (если ничего из вышеперечисленного). Текст должен быть заключен в кавычки
    («), если оно состоит из более чем одного слова.

Однако, если вы читаете дальше в документации, похоже, что вы можете передать дополнительные данные на перенаправленный URL:

Перенаправление на другой URL может быть полезным, но только если может быть передана некоторая информация, которая затем может быть использована для более четкого объяснения или регистрации состояния ошибки.

Для достижения этого при отправке перенаправления ошибки будут установлены дополнительные переменные среды, которые будут сгенерированы из заголовков, предоставленных исходному запросу, добавив «REDIRECT_» к исходному имени заголовка. Это обеспечивает документ ошибки в контексте исходного запроса.

Прочитайте документацию для всей доступной информации перенаправления. Вы можете найти что-то полезное там.

Возможно, вы перенаправляете все 404 на какой-то контроллер, который перенаправляет пользователя на нужную страницу 404 через PHP, учитывая дополнительную информацию о перенаправлении.

1

Другие решения

Вы можете использовать один файл PHP для ErrorDocument, например, так

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 -->

Преимущество использования include заключается в том, что вы можете доставлять любой контент, который вам нужен, это, вероятно, более плавное взаимодействие с пользователем. Вы можете предпочесть использовать перенаправление, чтобы направить пользователя обратно в логику подкаталога.

Я не проверял это, это может потребовать некоторых корректировок.

0

По вопросам рекламы [email protected]