Возможно ли такое решение для 301-го редиректа внутрисайта?

regta
На сайте с 15.04.2006
Offline
300
567

Здравствуйте

Допустим, существует некий сайт c четкой структурой УРЛ-ов:

http://www.site.ru/

http://www.site.ru/tovary/

http://www.site.ru/tovary/sumki/

http://www.site.ru/tovary/sumki/women/

http://www.site.ru/tovary/sumki/women/model555/

В браузере запрашивается урл:

http://www.site.ru/tovary/sumki/women/*******/

проверям: существует? значит открываем. Не существует - делаем 301й редирект на http://www.site.ru/tovary/sumki/women/

http://www.site.ru/tovary/sumki/******/

проверям: существует? значит открываем. Не существует - делаем 301й редирект на http://www.site.ru/tovary/sumki/

http://www.site.ru/tovary/******/

проверям: существует? значит открываем. Не существует - делаем 301й редирект на http://www.site.ru/tovary/

http://www.site.ru/*****/

проверям: существует? значит открываем. Не существует - делаем 301й редирект на http://www.site.ru/

Что это дает:

- для многостраничных сайтов со сложной структурой возможность сохранить весь приобретенный вес страниц (например, в случае с ИМ - исчезают старые товары, страница становится неактивной, отправляет на 404-ю)

Подводные камни (их как-то надо обойти):

1. Последний слеш.

http://www.site.ru/tovary/sumki/women/model555

лучше все-таки редиректить на http://www.site.ru/tovary/sumki/women/model555/ , а не на http://www.site.ru/tovary/sumki/women/ (если model555 существует)

2. Перестановка параметров

http://www.site.ru/tovary/women/sumki/

лучше все-таки редиректить на http://www.site.ru/tovary/sumki/women/, а не на http://www.site.ru/tovary/

----------------------

Уважаемые знатоки, внимание вопросы:

1. Есть ли среду существующих CMS такая, которая позволяет работать с 301м редиректом подобным образом?

2. Можно ли создать универсальный скрипт для такой обработки 301-го редиректа, который подходил бы для любого сайта, или в каждом случае нужно заморачиваться отдельно?

---------------------

Спасибо, буду очень признателен за ваши мысли по этому поводу.

Цитируйте, плиз, историю переписки в личке. Спасибо.
A
На сайте с 19.07.2010
Offline
130
#1

пишется обработчик 404-й ошибки, в нем:

1. сопоставляем "REQUEST_URI" с урлами подкатегорий / категорий и т.д., если ничего не нашли, то для 301-го выбираем главную

1.1 ну или тупо обрезаем урл до ближайшего справа слеша. это тоже работает.

2. изменяем хеадер страницы с 404-го на 301-й

3. отсылаем сам 301-й редирект на нужную страницу

работает все замечательно, браузер увидит один 301-й.

ps: не забывайте в этот скрипт добавить исключения для проверки "вебмастера" гугла/яндекса, иначе проверку можно не пройти. :)

.............
SeVlad
На сайте с 03.11.2008
Offline
1609
#2
regta:
буду очень признателен за ваши мысли по этому поводу.

На 404 должно отдаваться 404 и никак иначе.

Саму страницу 404 можно оформить как угодно (для шопа, например, вывести предполагаемые предложения юзеру - "похоже, вы искали..", "похожие товары" и тд). Вплоть до 301 по таймауту.

Делаю хорошие сайты хорошим людям. Предпочтение коммерческим направлениям. Связь со мной через http://wp.me/P3YHjQ-3.
M
На сайте с 04.12.2013
Offline
223
#3

1. Насчет популярных CMS не скажу, т.к. не пользуюсь. Но делается это элементарно. Например, мне сразу стало понятно, как это можно сделать в используемом мной движке: либо в обработчике 404-ой движка, либо непосредственно в модуле, отвечающем за ветку tovary, чтобы перехватить 404-ую (в последнем случае реализовать перенаправление с tovary на главную не получится, но в реальных условиях это и не нужно – с полным исчезновением ветки tovary, думаю, вы погорячились).

2. Возможно, достаточно универсальным решением как раз и будет реализация через обработчик 404-ой в CMS (в используемом мной движке именно этот обработчик отвечает за отправку 404-го заголовка, т.е. поставить условие на отправку другого заголовка вообще не проблема). Еще как вариант можно попробовать внедрить фильтр до детекта на 404-ую, но тут проблема в том, что тогда вам самому как-то придется определять наличие/отсутствие искомого объекта.

Домены и скрипт для коротких ссылок: https://u75.ru/domains-for-shortcuts
IL
На сайте с 20.04.2007
Offline
435
#4
regta:
2. Можно ли создать универсальный скрипт для такой обработки 301-го редиректа, который подходил бы для любого сайта, или в каждом случае нужно заморачиваться отдельно?

Можно.. Плата за универсальность - "костыльность" + потенциальная нагрузка.

Добавить "прокладку", которая будет выполняться перед основным скриптом и обрабатывать редиректы. Для получения самих редиректов можно:

1. опрашивать CMS на лету на наличие страницы по указанному URL

2. опрашивать CMS по команде (крон/обновление базы и тд) и сохранять в "кэш" (промежуточное хранилище)

3. комбинировать.. (проверять кэш.. при отсутствии в кэше - обращаться к CMS, сохранять результат в кэш)

... :) Облачные серверы от RegRu - промокод 3F85-3D10-806D-7224 ( http://levik.info/regru )
A
На сайте с 19.07.2010
Offline
130
#5

ivan-lev, есть еще вариант "универсального костыля" при помощи буферизации вывода пхп

1. включаем буферизацию и устанавливаем коллбек на себя

2. отдаем управление сторонней CMS, скрипту, кому угодно

3. получаем управление по колбеку, анализируем, если 200 - ничего не делаем, если 404 - чистим буфер(то что CMS-ка туда вывела), переписываем хеадер на 301 и делаем сам 301-й куда нужно.

Результат можно закешировать, чтобы лишний раз не дергать CMS-ку.

Если лень писать код для кеширования, то можно настроить кеширование 301-х ответов прямо в nginx-е, он это хорошо умеет делать.

IL
На сайте с 20.04.2007
Offline
435
#6
admak:
ivan-lev, есть еще вариант "универсального костыля" при помощи буферизации вывода пхп

Почему "ещё"? Суть та же самая, вопрос в методе реализации "прокладки".

Я представлял как "прокладку" с "дополнительным" HEAD HTTP-запросом к CMS-ке (кэшировать результат) и флагом (передавать в заголовке, например) "не обрабатывать редирект".

В варианте с ob_.. главное, чтоб сами заголовки не "утекли".. ))


<?php

ob_start();

$t1 = headers_list ();

//header("Status: 404 Not Found");
header("HTTP/1.0 404 Not Found");
echo '404 Not found';

$t2 = headers_list ();

ob_end_clean();

echo "------<pre>\n";

print_r ($t1);
print_r ($t2);

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий