Почему 404 страница не всегда выбивает?

Здравствуйте. Подскажите, пожалуйста, почему 404 страница не всегда вызывается при неверном урл?

Пример:
Вбиваю какой нибудь ошибочный запрос /rtyutry
404 страница появляется
А вот если перейти через /?an=k9_6 то 404 страницы нет, а будет главная страница.
А вот вид таких урл ?an= это еще со старого сайта, потому в некоторых сервизах анализаторов куча ошибок.

Как исправить данный неприятный случай?
Александр Янк
29 февраля 2016, 03:17
modx.pro
2
1 729
0

Комментарии: 12

Василий Наумкин
29 февраля 2016, 07:08
+1
Потому что ?an=k9_6 — не страница, а параметр.

В твоём примере загружается главная страница и видит, что в $_GET['an'] есть значение k9_6 и может что-то с этим сделать.
    Александр Янк
    29 февраля 2016, 13:28
    0
    да я это понял, просто хотел, что бы 404 страница выбивала. Спасибо за разъяснения о GET параметрах.
    Наумов Алексей
    29 февраля 2016, 08:41
    +1
    Или сделай 301 редирект с ненужных страниц куда нибудь, или закрой их в robots.txt по маске.
      Илья Уткин
      29 февраля 2016, 09:36
      1
      +2
      Если такой адрес нужно убрать из индекса, просто добавь в robots.txt такую строку
      Clean-param: an *
        Александр Янк
        29 февраля 2016, 13:29
        0
        да, она до сих пор индексируется и в сеоранге вообще каша происходит. Спасибо большое.
        Максим Кузнецов
        29 февраля 2016, 12:00
        1
        +2
        Можно расписать плагин для такой ситуации:
        <?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'));
        			}
        
        		}
        	}
        — написал на скорую руку, если что — поправляйте %)
          Александр Янк
          29 февраля 2016, 13:29
          0
          Спасибо большое.

          Плагин надо вешать на событие OnHandleRequest?
            Максим Кузнецов
            29 февраля 2016, 13:43
            0
            Да, ну только в моем примере решается аналогичная проблема с /index.php?id=число.
            Для вашего случая вам нужно модифицировать входящий параметр (у меня id) и процесс сравнения под себя.
          Алексей Шумаев
          29 февраля 2016, 13:15
          +1
          в .htaccess
          RewriteCond %{QUERY_STRING} ^(.*)an= [NC]
          RewriteRule (.*) http://xxx/404.html? [R=301]
          Александр Янк
          29 февраля 2016, 13:32
          0
          Я полагаю, это проблемы бы не было, если бы у меня был метатег каноникал (канонические урл).

          Может кто даст ссылку или идею, как реализовать канонический метатег в области head?
            Максим Кузнецов
            29 февраля 2016, 13:46
            4
            +2
            Для fenom:
            {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]]]]`]]
            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
            12