Вопрос: Псевдонимы и канонический URL, или как добиться 301 средствами движка?
Уважаемые коллеги,
Надеюсь, кто-то сможет подсказать, как добиться правильной отработки альтернативных url-ов средствами движка. Я надеюсь, что это возможно, поскольку, заходя на адрес типа site.com/1.html происходит перенаправление с кодом 301 (moved permanently — то, что надо!) на адрес site.com/blog/blog_name/1.html (это можно увидеть по адресной строке браузера, и, например, по инспектору в Хроме).
Странно, что это работает даже когда я убираю соответствующую запись из $config['router']['uri'] в локальном конфиге.
Так вот — я хотел бы добиться того же эффекта для псевдонимов, которые задаю я. Чтобы псевдоним перенаправлял на корректный адрес LS с кодом 301. $config['router']['rewrite'] для этого не подходит, поскольку он полностью убирает один экшин, заменяя его другим. Старый становится недоступен. А вот создание псевдонимов в $config['router']['uri'] справляется с этой задачей наполовину — страница доступна по обоим адресам, но при этом по обоим с кодом 200.
Переход с кодом 301 совершает функция Location в классе Router, есть ли возможность вызывать её для стандартных псевдонимов (понятно, что нахачить можно чего угодно, но зачем, если это уже доступно?).
Заранее благодарю за любую помощь и подсказки!
Надеюсь, кто-то сможет подсказать, как добиться правильной отработки альтернативных url-ов средствами движка. Я надеюсь, что это возможно, поскольку, заходя на адрес типа site.com/1.html происходит перенаправление с кодом 301 (moved permanently — то, что надо!) на адрес site.com/blog/blog_name/1.html (это можно увидеть по адресной строке браузера, и, например, по инспектору в Хроме).
Странно, что это работает даже когда я убираю соответствующую запись из $config['router']['uri'] в локальном конфиге.
Так вот — я хотел бы добиться того же эффекта для псевдонимов, которые задаю я. Чтобы псевдоним перенаправлял на корректный адрес LS с кодом 301. $config['router']['rewrite'] для этого не подходит, поскольку он полностью убирает один экшин, заменяя его другим. Старый становится недоступен. А вот создание псевдонимов в $config['router']['uri'] справляется с этой задачей наполовину — страница доступна по обоим адресам, но при этом по обоим с кодом 200.
Переход с кодом 301 совершает функция Location в классе Router, есть ли возможность вызывать её для стандартных псевдонимов (понятно, что нахачить можно чего угодно, но зачем, если это уже доступно?).
Заранее благодарю за любую помощь и подсказки!
15 комментариев
Дальнейшая обработка идёт стандартно. Копаем глубже.
Поэтому как бы приладить Location к псевдонимам… и почему он вызывается при показе топика по адресу id.html (независимо от настройки псевдонимов, но не вызывается при вызове моих псевдонимов?
Я так понимаю, что хакнуть ядро тут не так и трудно будет (могу ошибаться), но именно хаканья и хотелось бы избежать.
Если так, то его использование полностью устраивает :) Только, насколько я вижу, он не прописывается для страниц, прописанных в $config['router']['uri']. Вообще, это тянет на прекрасное дополнение к CMS-ке — правильная работа с псевдонимами на полу не валяется. Надо глянуть, может получится патч предложить? :)
Только ты так говоришь, будто LS уже это делает. Я пока не вижу, как это сделать — подскажи, пожалуйста, что я упускаю (если упускаю).
Я только сказал идею, что проще ставить на некоторые страницы либо noindex либо canonical для того чтобы избавляться от дублей
Т.е. что-то таки заложено, в теории. Копаю дальше.
Вызвать эту функцию, чтобы установить канонический урл, в Router::RewriteRequest (где разбирается конфиг псевдонимов) не представляется возможным — потому что объект Viewer на тот момент ещё неинициализирован.
Самое раннее, куда получается его впихнуть, это в Router::Exec, после инициализации объекта Engine (логично). И пока что у меня это получилось только в виде хака (и он работает), но я хочу понять, как это сделать «красиво» — то ли плагином, то ли предложить дописать эту функциональность в ядро.
Я так понимаю, что если делать плагин, то надо переписывать весь класс Router, только пару методов зацепить не получится. Хотелось бы избежать массированного копи-паста.
Надо ещё подумать, если есть идеи — дайте знать.
Приведу другой пример вот есть лента топиков новая, за 24ч, за неделю, за месяц, по сути это одна и та же лента и даже контент на ней очень похожий, так вот правильнее чтобы яндекс понимал, что лент много, но что они все по сути являются разновидностью ленты «новое» и все вариации урлов ведут в конечном счете на одну новое лента. т.е. все имеют канонический урл который указывает всего лишь на одну, так сказать общую для всех.