Как перенаправить пользователя на страницу 404 с помощью header?

У меня есть функция seo_replace

function seo_replace($tr)
{
    $old = '';
    $unwanted_array = array(
        'Š' => 'S', 'š' => 's', 'Ž' => 'Z', и тд...
    );
    $tr = strtr($tr, $unwanted_array);
    $tr = preg_replace("~[^a-z0-9]~i", "-", $tr);
    $tr = strtolower($tr);
    $final_name = '';
    for ($i = 0; $i < strlen($tr); $i++) {
        if ($tr[$i] != $old) $final_name .= $tr[$i];
        if ($tr[$i] == '-') $old = $tr[$i];
        else $old = '';
    }
    $tr = $finalna_nazwa;
    $tr = trim($tr, '-');

    return $tr;
}


RewriteRule ^post/([0-9]+)/([a-z]+)/([a-z0-9-]+)$ post.php?id=$1&language=$2


Эта функция и файл .htaccess помогают сделать ссылку вроде:
mysite.ru/post/2/shto-my-delaem

Нужно сделать следующее: - когда пользователь меняет эту ссылку, например, на: mysite.ru/post/2/bla-bla-bla то переправлять его на страницу 404

Как это сделать с помощью header?
  • Вопрос задан
  • 159 просмотров
Решения вопроса 2
Stalker_RED
@Stalker_RED
header('Location: http://www.example.com/404.html');


Но вообще это не очень хорошо, при 404 лучше не делать редирект, а показывать ее сразу без смены url, чтобы пользователь мог исправить опечатку.
Ответ написан
@granty
В вашем файле post.php на входе вы имеете два параметра: $_GET['id'] и $_GET['language']
По $_GET['id'] вы лезете в БД и формируете статью для показа. Вам надо в верхней части post.php дополнительно сформировать ЧПУ-шную часть URL этой статьи (для этого и используется ваша seo_replace()), и сравнить его с $_GET['language']. Если они совпадают - отдаёте статью, если нет - делаете одно из 2-х:
a) Redirect 301 на правильный $URL, вы его уже сгенерили для сверки с $_GET['language']:
header($_SERVER["SERVER_PROTOCOL"].' 301 Moved Permanently');
header("Location: $URL");
exit;

или

б) Отдаёте 404 страницу:
header($_SERVER["SERVER_PROTOCOL"].' 404 Not Found'); exit;


Что лучше сделать - решайте сами, ибо такое псевдо-ЧПУ это всегда гемор.
- Недруги могут ставить на ваш сайт ссылки вида /post/4/erotika_bez_sms и по id=4 страница будет показываться. При редиректе такие ссылки приклеятся на статью, а по 404 - нет.
- при простановке внешних ссылок может обрезаться часть ссылки, но по Redirect 301 вы её подберёте, если сохранилась часть /post/4/.

в догонку

У вас в функции seo_replace() ошибка - используется непроинициированная переменная $finalna_nazwa (там должна стоять $final_name).
Кстати, странное название $finalna_nazwa. Пани разумеет по-польску?
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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