АнтиСео в MODX 2.4.0

Доброго времени суток, господа
Думаю не все в курсе (по крайней мере я не был) о том, что последние версии modx не корректно отрабатывают в связке в nginx ЧПУ (верней переадресацию при включении чпу).

В результате чего контент сайта целиком дублируется в глазах поисковика и вы уныло катитесь вниз в выдаче.
Приведу простой пример:
Ваш сайт доступен по ссылке */index.php?id=1 и /, */index.php?id=2 и по чпу документа с id 2 и т.д.

К сожалению на modhost установлен nginx и я совершенно случайно обнаружил этот факт.

Василий предложил использовать плагин

<?php
if ($modx->event->name == 'OnHandleRequest') {
	if (!empty($_GET['id'])) {
		$id = (int)$_GET['id'];
		if (!$modx->getCount('modResource', array('id' => $id, 'published' => 1, 'deleted' => 0))) {
			$id = $modx->getOption('error_page', null, $modx->getOption('site_start'));
		}
		$modx->sendRedirect($modx->makeUrl($id));
	}
}
На первый взгляд он закрывает эту дырку, но на практике получилось, что он ресолвит id и для страниц бэкенда, что убило его функционал.
Так же обратил внимание, что при включении этого плагина слетает выборка последних новостей (последние 3 дочерных документа у родителя по id).

Вот собственно вопрос:
как поставить проверку по содержанию /manager/ в url?
Почему может не работать pdoResources при включении этого плагина?
SaLacoste
03 декабря 2015, 22:39
modx.pro
11
7 039
+1

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

Максим Кузнецов
04 декабря 2015, 02:59
+3
По поводу манагера и гет-параметров, проблему можно решить так:
<?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') {
			$uri = intval(str_replace('/index.php?id=', '', $_SERVER['REQUEST_URI']));
			//не уверен, нужна ли здесь проверка на наличие ресурса, т.к. в случае отсутствия оного, событие должно перехватить OnPageNotFound
			
			if(empty($uri)) {
				$url = 1;
			}

			$modx->sendRedirect($modx->makeUrl($uri));
		}
	}
    Воеводский Михаил
    04 декабря 2015, 04:25
    0
    Проверка нужна, тк OnHandleRequest запускается до проверки существования ресурса.
      Андрей Копп
      04 декабря 2015, 18:12
      -2
      Спасибо, на Apache работает)
        Василий Наумкин
        04 декабря 2015, 18:57
        +1
        Да это, блин, даже на IIS работать будет, потому что работает сам MODX, а не веб-сервер
      Василий Наумкин
      04 декабря 2015, 05:30
      +1
      Опять это «к сожалению на modhost установлен nginx», как будто где-то он сегодня не установлен, или на Apache2 такого поведения нет. Приведу ответ Василия из поддержки modhost.pro:

      Еще раз — какое отношение к вашей проблеме имеет хостинг? Почтайте, что ли, о ЧПУ. Её суть заключается в том, что запросы, которых реально нет на сервере отправляются на index.php с параметром.

      То есть, если на сервере есть файл site.com/filename.txt, то nginx его отдаст сам. А если нет, то будет вызван
      /index.php?q=/filename.txt
      А дальше уже сам сайт определяет, что отдать на этот запрос — файл, редирект или 404.

      Таким образом, при прямом запросе index.php?id=10 friendly urls и редиректы сервера не используются вообще. Движок получает команду показать 10ю страницу и сам её обрабатывает.

      Версия MODX 2.2 при этом умела делать редиректы на канонический адрес. Новые версии, почему-то, перестали. Но каким образом за вас это должен исправлять хостинг — я отказываюсь понимать.

      Откуда nginx вообще знает, какой именно адрес соответствуют 10 странице в MODX? Это знает только MODX. Ну и откуда у вас на сайте такие ссылки, чтобы к ним обращался поисковик — отдельный вопрос.

      И
      Покопался еще, и выяснил, что за это отвечает системная настройка request_method_strict, отключенная по умолчанию.

      Правда, плагин всё равно лучше, потому что он редиректит куда надо, а настройка просто включает игнорирование неправильных запросов. Но, в любом случае, обвинять хостинг в вашей проблеме не стоит.

      В плагине и правда нужно добавить проверку на $modx->context->key != 'mgr', тут я не доглядел.

      P.S. Это АнтиСЕО началось с версии 2.3, насколько я могу судить. Это ж тысячи сайтов должны были просесть в выдаче.
        SaLacoste
        04 декабря 2015, 06:30
        0
        Версия MODX 2.2 при этом умела делать редиректы на канонический адрес. Новые версии, почему-то, перестали. Но каким образом за вас это должен исправлять хостинг — я отказываюсь понимать.
        Есть сайт на 2.3.3 и Апаче, все работает.
        Сам nginx может и не причем, но на MODX с nginx не работает.

        Ну и откуда у вас на сайте такие ссылки, чтобы к ним обращался поисковик — отдельный вопрос.
        Исторически присутствуют нативные ссылки разного рода. Сайт меняется, cms меняются, а ссылки лучше бы сохранять с редиректами.

        Это ж тысячи сайтов должны были просесть в выдаче.
        Измениться в выдаче. Они и меняются каждый ап, вопрос по какой причине.
        Если проставить ссылок на идентичный контент на другой странице, то «правильная» страница будет иметь не уникальный контент.
        Вопрос в том, что знает ли ПС о наличии этих альтернативных страниц. В нашем случае знает, так как есть ссылочное в этими урл исторически.
          Василий Наумкин
          04 декабря 2015, 06:39
          0
          Ну так нужно настроить такие редиректы, нет?

          Или они в .htaccess настроены, а тут нужно их под nginx переписать и вся проблема именно в этом? Действительно, залез в .htaccess, а там:
          RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\ HTTP/
          RewriteRule ^index\.php$ http://sitename.ru [R=301,L]
          Видимо таким образом Apache2 типа «сам» и делает редиректы — при их настройке, да.

          То есть, вся претензия к хостингу, MODX, SEO, nginx и прочему заключается в «Мы не знали, что у вас нет Apache2 и не читали раздел настройка веб-сервера»?!
            SaLacoste
            04 декабря 2015, 06:47
            0
            Ох, епт.
            Василий, у Вас хороший хостинг и претензий к нему нет, а есть проблема.

            Не читал, но даже если бы читал ДО переезда, то о такой проблеме я не знал.
              Василий Наумкин
              04 декабря 2015, 06:49
              +3
              Ну вот мы её, наконец-то, и нашли.

              У тебя файл .htaccess на 25 килобайт с десятками хитрых правил, которые нужно как-то переписать для Nginx, или забить в компонент Redirector для MODX. После этого все редиректы вернутся и проблем с SEO больше не будет.

              .htaccess работает только в Apache2, Nginx же рассчитан на более высокие нагрузки и не может себе позволить читать дополнительный файл при каждом запросе.
        Михаил
        04 декабря 2015, 06:03
        -5
        Я никогда не заморачивался на счет СЕО. Просто делал заголовки более менее и все. И никуда не упал. Даже поднимался)
        Только Nginx тут действительно не причем.
          SaLacoste
          04 декабря 2015, 06:40
          +2
          Вы становились в топ-3 по ВЧ запросам (частотность от 10к) без заморочек на сео?
          Если да, то покажите эту нишу с такой конкуренцией:)
            Михаил
            04 декабря 2015, 06:45
            +2
            Я даже не понял что Вы сказали ))))))))))))))))))))
            Просто я не лезу в СЕО. Главное контент )
              Антон Фомичёв
              04 декабря 2015, 09:30
              +1
              Вот прям-таки подпишусь под каждым словом! Я вообще считаю, что вот эта вот целая индустрия CEO, гребущая немалые деньги — сплошное надувательство. Если сайт с уникальным, востребованным контентом, на который ссылаются, который нужен посетителям, то сайт будет в топе выдачи с минимальными рекомендованными самими поисковиками настройками.
                Павел Гвоздь
                04 декабря 2015, 13:00
                +2
                индустрия CEO, гребущая немалые деньги — сплошное надувательство
                Оптимизация оптимизации рознь. Есть «методы» продвижения от обманщиков для лохов несведущих людей в этой теме, о которой сказано в процитированном мной заявлении выше, в которую входит продвижение ссылками (в наше время), указание простыни ключевых слов на странице и подобные сказки. А есть рабочие методы, вроде юзабилити причёсывания сайта для большего удобства пользователя, качественная проработка текста (это когда текст грамотно структурирован и разбит подзаголовками, лучше всего без воды), внедрения на сайт удобных функций (вроде калькулятора) и т.д.

                Если чего-то не понимаешь — не нужно категорично заявлять, что этого нет или что это не работает. Это повседневная проблема нашего человека. То, что однажды ваш сайт попал в ТОП и продержался там недельку по НЧ (утрирую), не значит, что минимально указав какие-то моменты и проставив на него кучу ссылок с ГС у вас получилось продвинуть его не прибегая к услугам т.н. «профи в СЕО». Обычно даже если сайт в ТОП-3 по ВЧ — это не значит, что у него куча ссылок на морду или даже юзабилити удобство для пользователя проработано на высшем уровне. Просто на нём есть, к примеру, очень удобная функция калькулятора для подсчёта цены на пластиковое окно или ещё что-то в этом духе. Надо понимать, что тот-же Яндекс в наше время умеет оценивать удобство сайтов по поведению пользователей на них (да, вы не поверите, но технологии в наше время доросли до такого уровня). Однако это не говорит о том, что это самый главный и важный фактор. Есть такие маленькие китайцы люди, их называют асессорами (вы и сами можете попробовать себя в этом деле), так вот они оценивают множество различных факторов на сайте вручную. И часто бывает так, что от их оценки зависит ТОП-3 какого-либо ВЧ.

                Ещё раз повторю. Если чего-то не понимаешь — не нужно категорично заявлять, что этого нет или что это не работает.
                  Антон Фомичёв
                  04 декабря 2015, 13:30
                  -2
                  А есть рабочие методы, вроде юзабилити причёсывания сайта для большего удобства пользователя, качественная проработка текста (это когда текст грамотно структурирован и разбит подзаголовками, лучше всего без воды), внедрения на сайт удобных функций (вроде калькулятора) и т.д.
                  Ну и как это противоречит сказанному мной:
                  сайт с уникальным, востребованным контентом, на который ссылаются, который нужен посетителям

                  Если чего-то не понимаешь — не нужно категорично заявлять, что этого нет или что это не работает.
                  Где же это я такое утверждал? Я говорил, что индустрия «профессиональной» поисковой оптимизации слишком раздута и во многом её востребованность притянута за уши.

                  Просто на нём есть, к примеру, очень удобная функция калькулятора для подсчёта цены на пластиковое окно или ещё что-то в этом духе.
                  Опять же, это как раз то, о чем я и говорил. Основа всего — уникальный востребованный контент.

                  Надо понимать, что тот-же Яндекс в наше время умеет оценивать удобство сайтов по поведению пользователей на них (да, вы не поверите, но технологии в наше время доросли до такого уровня).
                  Ну где же ты увидел, что я спорю с этим? Разумеется, удобство для пользователя — фактор, напрямую соперничающий с качеством контента. Если я ищу какую-то определенную информацию, но сайт при этом плюется всякими модальными окнами с предложением чего-нибудь полайкать, чудовищно выглядит на моем телефоне или имеет противоестественную навигацию — я уйду с него и не стану читать нужную мне информацию, поищу более удобную замену.
                  Только как это всё связано с «супер-профи» от СЕО и их ценниками — непонятно.
                  SaLacoste
                  04 декабря 2015, 13:44
                  +3
                  Индустрия сплошного надувательства?
                  Вы прям холи вар готовы объявить. Тогда Я.метрика — это панацея.

                  Контент не менялся, просто провели базовые работы, расширили семантику.
                  Как дальше конвертировать это все в деньги, уже второй вопрос. Но если Вы что-то продаете/торгуете в интернете и действительно считаете что оптимизация сайта это пустые слова, то вы теряете в продажах.
                    Антон Фомичёв
                    04 декабря 2015, 13:53
                    0
                    Я не утверждал, что оптимизация не работает. Я говорил, что достаточно следовать рекомендациям самих поисковиков. Нет необходимости прибегать к услугам профессионалов СЕО, если на сайте есть нужный пользователям контент. Достаточно, как Вы написали, провести базовые работы, выполнить рекомендации поисковиков, которые, в целом, не сложны и вполне логичны.
                    Это как объявления о компьютерной помощи, которые массово расклеиваются в подъездах. «Установка программы — 200 р, удаление вируса — 500 р» и т.д. Это задачи для уровня рядового пользователя. Я же при этом не утверждаю, что эти «компьютерные мастера» не смогут реально установить программу. Смогут, скорее всего. Но это должен уметь делать любой пользователь ПК. Вы же не зовёте мастера, который запустит Вам стиральную машину на определённую программу или, например, включит мультиварку в нужном режиме.
                      Сергей Шлоков
                      04 декабря 2015, 18:49
                      +1
                      Вы же не зовёте мастера, который запустит Вам стиральную машину на определённую программу или, например, включит мультиварку в нужном режиме.
                      Мастера нет, а вот симпатичную мастерицу можно. :)
              Владимир
              04 декабря 2015, 12:01
              0
              Кстати, если можно, включите в профиле личные сообщения- есть офф-топ вопррос, но не флудить же тут…
              Павел Гвоздь
              04 декабря 2015, 12:42
              +1
              Переименуйте, пожалуйста, заголовок топика. Слишком уж он заманушный, да ещё и не в тему…
                Владимир
                04 декабря 2015, 12:51
                +1
                Кстати, весьма печалит, что запросы типа /index.php?id=131 при включенных friendly_urls и friendly_urls_strict вдруг стали работать (((
                Версия 2.3.6… Ни чего хорошего в этом нет.
                и правило
                if ($request_uri ~* '^/index.php$') {
                    return 301 /;
                }
                тут не помогает
                  SaLacoste
                  04 декабря 2015, 13:36
                  +1
                  Почему это Вас печалит?
                  Сео это магия и шарлатаны:)

                  Я решил эту проблему на текущий момент плагином, который указан выше в комментариях, на первый взгляд проблему закрывает, если что-то еще вылезет, то отпишусь.
                    Владимир
                    04 декабря 2015, 13:44
                    +1
                    печалит, ибо в прежних версиях точно помню, /index.php?id=131 редиректило на чпу адрес. Я, конечно, в robots.txt запретил индексацию таких дублей, но…
                    Да, я не утверждал, что СЕО — шарлатанство, но соглашусь, что шарлатанов в данной области полно, видимо из-за некомпетентности потенциальных заказчиков.
                      SaLacoste
                      04 декабря 2015, 13:45
                      +1
                      Редиректило, я даже не проверял данный редирект по старой привычке и сильно удивился когда при снятии позиций вылезли урлы с ?id*
                        Владимир
                        04 декабря 2015, 13:51
                        +1
                        У меня такое на 2.3.6 По прежнему не рискую переходить на 2.4.2., т.к. в остальном все хорошо.
                        А в роботс не только index.php, но и все гет параметры запретил. Но это ужасно, что настройка friendly_urls_strict не работает :(
                  Мордынский Николай
                  04 декабря 2015, 16:58
                  +2
                  $modx->sendRedirect($url,array('responseCode' => 'HTTP/1.1 301 Moved Permanently')); В случае если дубли страницы уже были проиндексированы то лучше так сделать
                    SaLacoste
                    04 декабря 2015, 22:48
                    0
                    Если ресолвить index.php?id*, то лучше всегда через 301.
                    т.е. чтобы плагин отдал 301 надо заменить
                    $modx->sendRedirect($modx->makeUrl($uri));
                    на
                    $modx->sendRedirect($url,array('responseCode' => 'HTTP/1.1 301 Moved Permanently'));


                    верно?
                    Павел Крылов
                    04 декабря 2015, 19:26
                    +2
                    Все делается элементарно просто с помощью Атрибут rel=«canonical» тега
                      Мордынский Николай
                      05 декабря 2015, 02:01
                      0
                      Как вариант
                        Мордынский Николай
                        06 декабря 2015, 00:24
                        +1
                        Кстати гугл и яндекс не гарантируют, что именно страница из каноникал будет выбрана роботом как основная. Это у них же в описании написано.
                        Мордынский Николай
                        06 декабря 2015, 00:18
                        1
                        +2
                        В тему доступности главной страницы по site.ru/index.php тут
                        <?php
                        	if ($modx->event->name != "OnHandleRequest" || $modx->context->key == 'mgr') {
                        		return;
                        	}
                        	
                        	if ($_SERVER['REQUEST_URI'] != '/') {
                        	    
                        	    $R_URI=substr($_SERVER['REQUEST_URI'], 1);
                        	    
                        	    if ($R_URI === 'index.php') $modx->sendRedirect('http://'.$_SERVER["SERVER_NAME"],array('responseCode' => 'HTTP/1.1 301 Moved Permanently'));
                        	    
                        		$uri = strtok(substr($_SERVER['REQUEST_URI'], 1), '?');
                        		
                        		if ($uri == 'index.php') {
                        			$uri = intval(str_replace('/index.php?id=', '', $_SERVER['REQUEST_URI']));
                        			//не уверен, нужна ли здесь проверка на наличие ресурса, т.к. в случае отсутствия оного, событие должно перехватить OnPageNotFound
                        			
                        			if(empty($uri)) {
                        				$url = 1;
                        			}
                        
                        			$modx->sendRedirect($modx->makeUrl($uri),array('responseCode' => 'HTTP/1.1 301 Moved Permanently'));
                        		}
                        	}
                          SaLacoste
                          06 декабря 2015, 00:33
                          1
                          +1
                          Страница index.php статична (ее урл имею ввиду), то ее легко можно закрыть правилом редиректа.

                          Про sendRedirect прочитал в документации, без доп. параметров он ставит 302 редирект, что не есть хорошо в нашей ситуации.
                          Но 301 редирект предложенный Вами не отрабатывал у меня, поэтому я написал полную запись

                          <?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') {
                          			$uri = intval(str_replace('/index.php?id=', '', $_SERVER['REQUEST_URI']));
                          			//не уверен, нужна ли здесь проверка на наличие ресурса, т.к. в случае отсутствия оного, событие должно перехватить OnPageNotFound
                          			
                          			if(empty($uri)) {
                          				$url = 1;
                          			}
                                                  $modx->sendRedirect($modx->makeUrl($uri), 0, 'REDIRECT_HEADER', 'HTTP/1.1 301 Moved Permanently');
                          		}
                          	}
                          Так все работает.

                          И если уже мы заговорили про canonical, то этот тег не гарантирует поведение ПС в выдаче, может и с тегом выйти в выдачу.
                          Эта проблема актуальна для страниц пагинации, например. Так как по умолчанию ставится только canonical на вторых и следующих страницах. (Я на этот счет даже писал Василию), корректно отрабатывать пагинацию через noindex, follow.

                          Shin
                          07 декабря 2015, 04:03
                          +1
                          Разве запись в robots.txt
                          Disallow: /index
                          не решает проблему дублей?
                          Проверьте тестером.
                            Павлик Мышкин
                            28 августа 2019, 14:24
                            0
                            Только в теории. Реалии от гугла:
                              srs
                              srs
                              28 августа 2019, 16:47
                              0
                              А как правильно тогда?
                                Павлик Мышкин
                                28 августа 2019, 19:10
                                0
                                Ну варианты есть разные. Роботс, 301, каноникал… Я бы после лишних действий со стороны поисковиков удостоверился, что как им не запрещай — они туда лезут. Думаю 301 это действительно железобетонное решение.
                            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                            38