Похоже, вы хотите не перенаправлять, а включать страницу, о которой идет речь.Перенаправление не обязательно.Фактически, это будет препятствовать использованию обработчика ошибок apache 404. Для хороших URL.
В следующем примере сценария сначала разрешается запрос к (относительному) имени файла, модулю.В вашем коде это будет new-url/based-on/some-logic.php
или аналогичный.
Рядом с этим, если модуль не найден, вместо него будет использован шаблон страницы ошибки.Я назвал его error404.php
, поэтому вам необходимо создать этот файл.
В качестве крайней меры, если даже шаблон ошибки не найден, будет возвращено стандартное сообщение об ошибке 404.
<?php
// === resolver ===
// put your logic in here to resolve the PHP file,
// return false if there is no module for the request (404).
function resolveModule() {
// return false;
return 'new-url/based-on/some-logic.php';
}
// returns the filename of a module
// or false if things failed.
function resolveFile($module) {
$status = 200;
if (false === $module) {
$status = 404;
$module = 'error404.php';
}
// modules are files relative to current directory
$path = realpath($module);
if (!file_exists($path)) {
// hard 404 error.
$status = 404;
$path = false;
}
return array($path, $status);
}
// process the input request and resolve it
// to a file to load.
$module = resolveModule();
list($path, $status) = resolveFile($module);
// === loader ===
// send status message
header($_SERVER['SERVER_PROTOCOL'] . ' ' . $status, true, $status);
if (false !== $path) {
include($path); // include module file (instead of redirect)
} else {
// hard 404 error, e.g. the error page is not even found (misconfiguration)
?>
<html>
<head>
<title>404 Not Found</title>
</head>
<body>
<h1>404:</h1>
<h3>Sorry, the page you have requested has not been found.</h3>
<p>Additionally the good looking error page is not available, so it looks really sad.</p>
</body>
</html>
<?
}