Почему 404 страница не всегда выбивает?
Здравствуйте. Подскажите, пожалуйста, почему 404 страница не всегда вызывается при неверном урл?
Пример:
Вбиваю какой нибудь ошибочный запрос /rtyutry
404 страница появляется
А вот если перейти через /?an=k9_6 то 404 страницы нет, а будет главная страница.
А вот вид таких урл ?an= это еще со старого сайта, потому в некоторых сервизах анализаторов куча ошибок.
Как исправить данный неприятный случай?
Пример:
Вбиваю какой нибудь ошибочный запрос /rtyutry
404 страница появляется
А вот если перейти через /?an=k9_6 то 404 страницы нет, а будет главная страница.
А вот вид таких урл ?an= это еще со старого сайта, потому в некоторых сервизах анализаторов куча ошибок.
Как исправить данный неприятный случай?
Комментарии: 12
Потому что ?an=k9_6 — не страница, а параметр.
В твоём примере загружается главная страница и видит, что в $_GET['an'] есть значение k9_6 и может что-то с этим сделать.
В твоём примере загружается главная страница и видит, что в $_GET['an'] есть значение k9_6 и может что-то с этим сделать.
да я это понял, просто хотел, что бы 404 страница выбивала. Спасибо за разъяснения о GET параметрах.
Или сделай 301 редирект с ненужных страниц куда нибудь, или закрой их в robots.txt по маске.
да, она до сих пор индексируется и в сеоранге вообще каша происходит. Спасибо большое.
Можно расписать плагин для такой ситуации:
<?php
if ($modx->event->name != "OnHandleRequest" || $modx->context->key == 'mgr') {
return;
}
if ($_SERVER['REQUEST_URI'] != '/') {
$uri = strtok(substr($_SERVER['REQUEST_URI'], 1), '?');
if ($uri == 'index.php') {
//Заменяем страницы вида /index.php?id= на чпу-шные
$id = intval($_GET['id']);
if ($modx->getCount('modResource', array('id' => $id))) {
$modx->sendRedirect($modx->makeUrl($id), array('responseCode' => 'HTTP/1.1 301 Moved Permanently'));
}
else {
//Если url не чпу, то обработка OnPageNotFound не срабатывает и необходимо дублировать определение страницы переадресации
$error_id = intval($modx->getOption('error_page'));
if ($error_id > 0 && $modx->getCount('modResource', array('id' => $error_id))) {
$redirect_page = $modx->makeUrl($error_id);
}
else {
$start_id = intval($modx->getOption('site_start'));
$redirect_page =$modx->makeUrl($start_id);
}
$modx->sendRedirect($redirect_page, array('responseCode' => 'HTTP/1.1 404 Not Found'));
}
}
}
— написал на скорую руку, если что — поправляйте %)
Спасибо большое.
Плагин надо вешать на событие OnHandleRequest?
Плагин надо вешать на событие OnHandleRequest?
Да, ну только в моем примере решается аналогичная проблема с /index.php?id=число.
Для вашего случая вам нужно модифицировать входящий параметр (у меня id) и процесс сравнения под себя.
Для вашего случая вам нужно модифицировать входящий параметр (у меня id) и процесс сравнения под себя.
в .htaccess
RewriteCond %{QUERY_STRING} ^(.*)an= [NC]
RewriteRule (.*) http://xxx/404.html? [R=301]
работает. спасибо большое.
Я полагаю, это проблемы бы не было, если бы у меня был метатег каноникал (канонические урл).
Может кто даст ссылку или идею, как реализовать канонический метатег в области head?
Может кто даст ссылку или идею, как реализовать канонический метатег в области head?
Для fenom:
Тегами modx:
Или, например, вот так (не помню для чего, но как-то возникла проблема с предыдущим вариантом, которая решилась нижеописанным примером):
{set $canonical_url = $_modx->makeUrl($_modx->resource.id, '', '', 'full')}
<link rel="canonical" href="{$canonical_url}" />
<meta property="og:url" content="{$canonical_url}" />
Тегами modx:
<link rel="canonical" href="[[~[[*id]]? &scheme=`full`]]" />
<meta property="og:url" content="[[~[[*id]]? &scheme=`full`]]" />
Или, например, вот так (не помню для чего, но как-то возникла проблема с предыдущим вариантом, которая решилась нижеописанным примером):
[[++site_url]][[*id:isnot=`[[++site_start]]`:then=`[[~[[*id]]]]`]]
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.