Я пробовал несколько потоков, но, похоже, похоже, что мне нужно.
У меня есть код 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, если эти категории выше не совпадают?
Поскольку, исходя из того, что я понимаю из вашего вопроса, 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-адреса, если они не указывают на файл или папку, которые существуют до перезаписи.
Проблема заключается в том, что теперь 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.
404.php
правильный, адрес должен быть относительно местоположения файла category.php или $_SERVER['Document_root']
На вашем 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.
mod_rewrite
просто не предназначен для того, чтобы быть в курсе ответа, просто запрос. Наилучшим подходом здесь было бы позволитьmod_rewrite
выполнить свою работу и инициировать ответ 404 в коде PHP, поскольку PHP - единственный, кто знает, доступен ли перезаписанный ресурс (кроме случаев, когда он физически существует на сервере).