Имеется сайт, практически на одном HTML, у которого довольно разветвленная структура. Есть понимание того, что при развитии сайта дальше структура будет только расти. Но при этом хочется отдавать пользователю адрес не в виде
При этом хочется сделать редирект с старых страниц на новые адреса, чтобы выдачу с поисковых запросов не терять, т.к. поисковики пока не переиндексируют буду кидать по старым адресам, да и мало ли кто себе сохранил уже в закладки и т.п.
Сделать с помощью mod rewrite перенаправление с httр://имя_сайта/подпапка/подпапка/подпапка/интересующая тема.htm на httр://имя_сайта/интересующая тема не проблема, но если кто обратится напрямую к httр://имя_сайта/интересующая тема получит отлуп( Перебивать весь сайт с потерей структуры, чтобы насоздавать папок httр://имя_сайта/интересующая тема/index.htm желания мало, иерархия очень помогает.
Теперь вопрос, это у меня не хватает знаний mod rewrite чтобы реализовать задумку, или тут надо другими методами? Да, переносить все на CMS вариант, но пока сил и времени на это нет. Какие тут еще могут быть варианты?
Вы правы в последнем абзаце! Нужно mod rewrite штудировать. Он, конечно, позволяет и «перенаправление с httр://имя_сайта/подпапка/подпапка/подпапка/интересующая тема.htm на httр://имя_сайта/интересующая тема» сделать и «напрямую к httр://имя_сайта/интересующая тема» обратиться.
Могу чуть позже конструкцию примерную набросать.
«httр://имя_сайта/интересующая тема» — каждый раз в ручную должно задаваться в правилах рерайта или как? Я имею ввиду, что не существует ли у вас нескольких .html файлов с одинаковыми названиями в разных папках? Например, httр://имя_сайта/подпапка/подпапка/подпапка1/интересующая тема.htm и httр://имя_сайта/подпапка/подпапка/подпапка32/интересующая тема.htm?
Ведь в таком случае, ни одна конструкция рерайта, кроме мозга, не сможет понять, на какой именно конечный файл редиректить httр://имя_сайта/интересующая тема
Это самое важное понятие похоже.
P.S. Кстати, делая редиректы с существующих httр://имя_сайта/подпапка/подпапка/подпапка/интересующая тема.htm на виртуальные httр://имя_сайта/интересующая тема при этом желая, чтобы был доступ к обоим адресам, вы не заставите проиндектировать поисковики новые, короткие пути. Боты признают их зеркалами. Что также отрицательно скажется на результатах выдачи сайта в поиске. Ну, либо жество запрещать индексировать старые пути и разрешать новые.
Мне кажется, это самое простое.
Если запрашиваемый УРЛ содержит .htm (или .html, в зависимости от того, что используется на сайте), то переадресуем, убивая все лишнее на httр://имя_сайта/НАЗВАНИЕ_ФАЙЛА
А если УРЛ не содержит .htm, значит пользователь обращается по новому адресу.
Тут остается вопрос, как рерайт определит, куда обращаться, если входящий запрос «httр://имя_сайта/интересующая тема». Ведь никаким правилами не заставить рерайт рыскать по каталогам на сервере и искать файл с названием «интересующая тема.htm».
Если у вас загвоздка была именно в поиске нужного каталога, в котором лежит файл, то скорее всего вам придется делать все редиректы жестко вручную, присваивая каждому адресу свой путь. Тогда прошу меня извинить, зря дал вам надежду, рерайт бессилен в поиске по северу, он не сможет найти нужный путь к файлу сам.
Можно и вручную, не проблема. Мне бы с 1 линком разобраться, остальные аналогично наштампую. Можете пример вашего решения написать? А то не совсем понятно с пересылкой обратно, т.е. когда с старого адреса на новый кидает — все ок. А когда заходят на новый, а инфа физически лежит в большой вложенности, как ему отдать эту инфу уже под новым именем? В общем, пример очень помог бы.
Так решения в общем и нет конкетного, поэтому и вопросов столько задаю. Не могу сейчас проверить правильность, пишу с андроидофона, нет полноценного компа.
В том и дело, что если ставить RewriteCond (условие), то никакой обратной пересылки не будет.
Например, надо существующий физически «httр://имя_сайта/подпапка/подпапка/подпапка/интересующая тема.htm» выдать по имени «httр://имя_сайта/интересующая тема».
Вариант 1. Пользователь запрашивает НОВЫЙ адрес.
#определяем, что это адрес НОВЫЙ, в котором нет .htm
RewriteCond %{REQUEST_URI} !^/\.htm$ [NC]
# определяем, куда надо направить пользователя; по имени файла, так как он УНИКАЛЕН
RewriteCond %{REQUEST_URI} ^/интересующая тема\.htm$ [NC]
#отправляем за нужным файлом, так как по его уникальности, мы знаем, где он лежит
RewriteRule ^(.*)$ httр://имя_сайта/подпапка/подпапка/подпапка/интересующая тема.htm [R=301,L]
Типа того. И так для каждого файла:
#определяем, что это адрес НОВЫЙ, в котором нет .htm
RewriteCond %{REQUEST_URI} !^/\.htm$ [NC]
# определяем, куда надо направить пользователя; по имени файла, так как он УНИКАЛЕН
RewriteCond %{REQUEST_URI} ^/ другая интересующая тема\.htm$ [NC]
#отправляем за нужным файлом, так как по его уникальности, мы знаем, где он лежит
RewriteRule ^(.*)$ httр://имя_сайта/подпапка/подпапка/другая интересующая тема.htm [R=301,L]
Вариант 2. Соответственно, если пользователь набирает старый адрес с .htm, то условия не проходят и все замечательно грузится по старому. В этом и идея моя состояла.
Можно (и нужно) сократить и один раз в начале проверить на отсутствие .htm (RewriteCond %{REQUEST_URI} !^/\.htm$ [NC] — это я имею ввиду), а подзапросами уже выводить пути.
А совсем правильный способ использовать RewriteMap.
Там можно будет создать ассоциативный массив соответствий путей и файлов (он может быть размещен в текстовом файле). Типа:
И уже после проверки на отсутствие в УРЛ .htm запускать RewriteMap и выбирать значения. Тут я наизусть без компа не напишу правильную конструкцию. Почитайте, например тут: www.shtogrin.com/library/web/mod_rewrite/doc/RewriteMap/
Надеюсь, я не запутал вас совсем и какая-то польза будет :-)