Правильный PHP для перенаправления 404? - PullRequest
1 голос
/ 15 июня 2011

Я должен использовать пользовательскую страницу 404 для перенаправления URL (.htaccess не вариант). Я думаю об использовании кода ниже. Я пытаюсь учесть правильное перенаправление и реальный случай, когда страница не найдена, добавив флаг к URL. Что ты думаешь?

<?php

// check GET for the flag - if set we've been here before so do not redirect

if (!isset($_GET['rd'])){
    // send a 200 status message
    header($_SERVER['SERVER_PROTOCOL'] . ' 200 Ok');
    // redirect
    $url = 'new-url/based-on/some-logic.php' . '?rd=1';
    header('Location: ' . $url);
    exit;
}

// no redirection - display the 'not found' page...
?>
<html>
<head>
    <title>404 Not Found</title>
</head>
<body>
<h1>404:</h1>
<h3>Sorry, the page you have requested has not been found.</h3>
</body>
</html>

Редактировать - причина .htaccess не вариант, потому что я работаю на IIS6 без apache.

Ответы [ 3 ]

4 голосов
/ 15 июня 2011

Добавить 404 заголовок поколение:

...
header("HTTP/1.0 404 Not Found");
// for FastCGI: header("Status: 404 Not Found");
// no redirection - display the 'not found' page...
?>
...

И удалить 200 код:

// delete this line
header($_SERVER['SERVER_PROTOCOL'] . ' 200 Ok');
// because code should be 302 for redirect
// and this code will be generated with "Location" header.
0 голосов
/ 15 июня 2011

Похоже, вы хотите не перенаправлять, а включать страницу, о которой идет речь.Перенаправление не обязательно.Фактически, это будет препятствовать использованию обработчика ошибок 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>
<?
}
0 голосов
/ 15 июня 2011

Если я не ошибаюсь, вы хотите, чтобы страница отображалась для 404 страниц, то есть страниц, которые больше не существуют.

Насколько мне известно (может быть, не так уж много) Вы не можете просто установить php-страницу как обработчик 404. Без .htaccess или файла apache conf.

Что я помню, так это то, что файл 404.shtml является файлом по умолчанию для обработчиков 404 при обычных настройках apache, поэтому вам нужно будет поместить свой код на эту страницу,

и так как вы не можете использовать .htaccess, а страница является SHTML, вы не можете поместить туда php, вы можете перенаправить Javascript с 404.shtml на 404.php,

Надеюсь, это поможет.

...