.htaccess перенаправить на 404, если нет совпадений

1

Я пробовал несколько потоков, но, похоже, похоже, что мне нужно.

У меня есть код htaccess для обслуживания страницы категории следующим образом:

RewriteRule ^([^/\.]+)/?$ category.php?s=$1 [L,QSA]

Флаг QSA включен, чтобы в основном обслуживать некоторые фильтры на странице. У меня только 4 категории, поэтому для аргументов ради моей категории URL будет:

http://domain.co.uk/category-url-1
http://domain.co.uk/category-url-2
http://domain.co.uk/category-url-3
http://domain.co.uk/category-url-4

Проблема, которую я испытываю и не могу решить, заключается в том, что мне нужно сопоставить эти категории в htaccess, а если они не существуют, переадресуйте на страницу 404. URL-адрес категории не изменится, поэтому я могу это сделать.

В настоящее время на моей странице категории у меня есть код PHP:

header("HTTP/1.0 404 Not Found");
header("Location: /404.php");

... если совпадение не найдено... но технически все это делает показано как 302, поскольку страница категории существует и обрабатывает код в первую очередь. Я проверил эти заголовки онлайн, и они дают 302.

Есть ли способ жестко закодировать это в htaccess, если эти категории выше не совпадают?

  • 0
    Это заголовки ответа, поэтому, если они размещены до того, как генерируется какой-либо вывод, он должен работать как положено. Можете ли вы показать нам код, где вы их используете?
  • 0
    mod_rewrite просто не предназначен для того, чтобы быть в курсе ответа, просто запрос. Наилучшим подходом здесь было бы позволить mod_rewrite выполнить свою работу и инициировать ответ 404 в коде PHP, поскольку PHP - единственный, кто знает, доступен ли перезаписанный ресурс (кроме случаев, когда он физически существует на сервере).
Показать ещё 1 комментарий
Теги:
.htaccess

2 ответа

5
Лучший ответ

Поскольку, исходя из того, что я понимаю из вашего вопроса, mod_rewrite всегда будет иметь страницу, которая существует (category.php), вы должны установить генерацию ошибок 404 на странице category.php,

Не утруждайте установку заголовка ошибки 404 отдельно, просто

    if (no match with categories){
     //header("Location:404.php",TRUE, 404);
      header("Location:404.php");
      exit;
    }

Из того, что я знаю.htaccess, он не может прочитать, если данные, которые он обрабатывает (URL категории), действительны или нет, как и в, он не может сказать вам, является ли категория подлинной или ложной, потому что это то, что может быть определен только PHP-скриптом.

жаль, что я пропустил Location: часть заголовка

Обновить

Я думаю, что цикл, о котором вы ссылаетесь, Дэвид, заключается в том, что, хотя файл PHP перенаправляется на страницу 404.php,.htaccess пытается сопоставить это с правилами перезаписи, поэтому вам нужно добавить проверки только для перезаписи URL-адресов, которые не являются ссылаясь на файлы или папки, которые уже существуют, в вашем.htaccess:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/\.]+)/?$ category.php?s=$1 [L,QSA] 

Это будет только переписывать URL-адреса, если они не указывают на файл или папку, которые существуют до перезаписи.

Обновить править 2

Проблема заключается в том, что теперь OP хочет, чтобы ошибки 404 страниц были замечены как 404 ошибки в аспектах SEO сайта, это не делается header("Location:") потому что его местоположение заголовка является перенаправлением.

Итак: Читайте здесь: Почему мое приложение PHP не отправит ошибку 404? Я думаю, проблема заключается в том, что, поскольку PHP устанавливает код состояния 404, файл не найден, тогда становится то, что PHP-страницы несут ответственность за вывод файла 404. Поэтому вместо того, чтобы устанавливать перенаправление местоположения заголовка, заголовок должен быть установлен как заголовок ошибки 404, а затем после заголовка страница ошибки 404 может выводиться на странице category.php как включаемая на странице категории,

Итак, решение, когда страница category.php имеет неверный вызов категории, ему нужно вывести заголовок с 404 в нем:

header('HTTP/1.0 404 Not Found');

сразу же после чего страница категории выводит сообщение в браузер, который будет включать в себя 404.php

такие как:

<?php
if (!category match){
    header('HTTP/1.0 404 Not Found');
    include "404.php";
}

Я не знаю, как настроен ваш 404.php, но вам может понадобиться настроить код для вывода файла include с возвращаемым значением в 404.php это должно приводить к отображению неправильных категорий кодов с 404 заголовками ошибок для целей SEO.

  • 0
    Спасибо за это. Это дает мне внутреннюю ошибку сервера, хотя. Я предполагаю, что это для более поздней версии PHP, чем сервер работает.
  • 0
    внутренняя ошибка сервера, вероятно, не вызвана PHP, читайте на php.net/manual/en/function.header.php @David. Пожалуйста, убедитесь, что адрес страницы 404.php правильный, адрес должен быть относительно местоположения файла category.php или $_SERVER['Document_root']
Показать ещё 7 комментариев
0

На вашем PHP вы должны проверить, является ли его категория-url-1, 2, 3 o 4. Вы можете сделать это, создав массив в вашем PHP-документе fe:

<!-- language: lang-php -->
$allowed_categories = array('category-url-1'
                             ,'category-url-2'
                             ,'category-url-3'
                             ,'category-url-4'
                           );

if (!empty($_GET['s']) && in_array($_GET['s'], $allowed_categories))
{
    echo 'Yes! The category exists!';
}
else
{
    header('HTTP/1.0 404 Not Found');
    echo 'The page is not found!';
}

Если вы хотите перенаправить его на определенный файл 404.php, достаточно заголовка с перенаправлением. Вы должны убедиться, что отправка заголовка 404 указана в файле 404.php.

  • 0
    Спасибо за ответ, это не совсем то, что я после, хотя. Мой код выше работает в том, что мне нужно, чтобы быть видимым для пользователя. Он проверяет категорию, устанавливает заголовок и перенаправляет на страницу 404 ... но когда я запускаю ее через онлайн-проверку заголовка HTTP: httpstatus.io, например, он дает мне 302, а затем 200 для страницы 404.php. Мне нужно, чтобы 302 был 404, чтобы Google мог его увидеть.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню