Anton_from_Amber
@Anton_from_Amber

Как оставить неизменным URL для 404 страницы в условиях MODx Evo, NGINX+phpFPM?

Готов посыпать пеплом голову и признать плохо ищущим, но действительно не могу решить проблему и спрашиваю у сообщества.

Есть сайт на MODx Evo. Хочу сделать по человечески страницу с 404 ошибкой. Основная проблема — оставить строку адреса сообщающей о отсутствующей цели и дать возможность исправить опечатку или просто понять что пошло не так.

Финт с использованием javascript+HTML5 history не помог, т.к. я не нашел корректный адрес.

Возможно уже существует модификация (плагин например) для модекса?

Возможно эту проблему можно решить на уровне фронтенда NGINX+phpFPM?


Подскажите, пожалуйста, как в этом случае поступить.
  • Вопрос задан
  • 4238 просмотров
Решения вопроса 1
Anton_from_Amber
@Anton_from_Amber Автор вопроса
Разобрался как это сделать. Оставлю для других страждущих.
Решение далеко не элегантное, но вполне рабочее.

Правим только модекс.
В корень сайта (или куда вам будет удобно) размещаем текстовый документ, который будет выводится в ответ на ошибку. Я разместил в нём свои плейсхолдеры для последующей замены.
Создаём плагин, смысл которого в перехватывании ошибки 404 и выводе статического фала в выдачу.

Надо помнить, что через АПИ модекса нельзя просто так просчитать чанк, если в нём есть вызовы других чанков, сниппетов и плейсхолдеров. Однако при должном уровне детализации можно в коде плагина вызвать вставку статических чанков (к примеру подвал), результатов работы определённых сниппетов (к примеру меню или ленту новостей).

В моём случае я имел пару статических чанков и плейсхолдер для искомой некорректной строки. В результате код плагина выглядит так:

$basePath = $modx->config['base_path'];
$e = &$modx->Event;

switch ($e->name) {
	case 'OnPageNotFound' : {
		$out = file_get_contents("404.html");
		$rpl = 'http://my.domain.ua'.$_SERVER["REQUEST_URI"];
		$out = str_replace("{{ErrURL}}", $rpl, $out);
		$rpl=$modx->getChunk('metro_mnd');
		$out = str_replace("{{metro}}", $rpl, $out);
		$rpl=$modx->getChunk('footer_mnd');
		$out = str_replace("{{footer}}", $rpl, $out);
		echo $out;
		exit;
	}
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
soloweb
@soloweb
DevOps, Networks, Kubernetes, Python, Go
Ну смотри, в правилах «try» у Nginx есть возможность перехватить запрос, его можно перенаправить куда тебе угодно, это может быть php скрипт или статическая страница, или что-то другое.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы