Впервые столкнувшись с mod_rewrite несколько дней назад уже запутался... Задача: Необходимо, чтобы: - по любой внешней по отношению к mysite.ru ссылке (например, по ссылке в поисковике), указывающей на любой файл, кроме index, пользователь мог перейти только на index; - при прямом наборе адреса пользователем на любой файл сайта mysite.ru, переход пользователя мог бы быть только на index; - переход пользователя по внутренней ссылке, указывающей на любой файл, принадлежащий сайту mysite.ru, не вызывал бы редиректа на index; - НО, необходимо!, чтобы поисковики могли видеть и индексировать все страницы и файлы сайта mysite.ru. (сайт лежит в папке основного домена home/mysite.ru). CMS - отсутствует! Куки если и могут быть поставлены, то только в index! Сперва придумал вот такой алгоритм (надеюсь корректный): Код (Text): IF 'пользователь' AND 'ссылка не принадлежит mysite.ru' THEN 'перенаправить на index.htm' ELSE 'разрешить все файлы (только для поисковых роботов)' Это то, что получилось наворотить самостоятельно, похожее на мой алгоритм (после 3-х дней мучений): Код (Text): RewriteEngine on Options +FollowSymlinks RewriteBase /mysite\.ru/ #условие "если ссылка не с mysite.ru": RewriteCond ${HTTP_REFERER} !^www\.mysite\.ru* [NC,C,NS] #или так? RewriteCond ${HTTP_REFERER} !^\www.?\mysite\.ru* [NC,C,NS] #проверка - пользователь или бот (главное - распознать usera): RewriteCond %{HTTP_USER_AGENT} ^Mozilla.* [NC,OR] RewriteCond %{HTTP_USER_AGENT} ^Opera.* [NC,OR] RewriteCond %{HTTP_USER_AGENT} ^Firefox.* [NC,OR] RewriteCond %{HTTP_USER_AGENT} ^Safari.* [NC,OR] RewriteCond %{HTTP_USER_AGENT} ^Lynx.* [NC] #теперь правило - при выполнении условий выше направить на index: Redirect 303 / http://www.mysite.ru #или так? RewriteRule ^(.*)$ index.php/$1 [R,L] #синтаксис в предыдущем и следующих? RewriteRule ^(.*)|(.*)\.(.*)$ http://www.mysite.ru/$1 [R=permanent,L] #или так? RewriteRule (.*) http://www.mysite.ru/$1 [R=permanent,L] Поправьте, плз, если что-где не так (там бы еще клиентов, наверное, добавить бы?). В коде 4 варианта перенаправления - какой оставить, как было бы правильно?. + корректность синтаксиса? Насколько необходимо и корректно наличие флагов [C] и [NS] в первом условии? Наличие флага [L] в конце правила влияет только на текущее правило? можно ли будет после выполнения этого правила поставить еще правила?
А что, такую задачу разве только я поставил? Не первый раз встречаю этот вопрос. Может, с точки зрения профи я пытаюсь извратиться? Цель, которую мне необходимо достичь, я написал в самом начале поста. Вход на сайт для любого пользователя должен быть только!! через один файл, но при этом, остальные файлы должны индексироваться поисковиками. Padaboo 0.1 - - оценил! Хорошо, тогда так: Код (Text): ЕСЛИ 'НЕ бот (выборчно, основные поисковики)' И 'ссылка не принадлежит mysite.ru' ТОГДА 'перенаправить на index.php' ИНАЧЕ 'разрешить все' - условие для ботов вроде чаще встречается? - а если к.-л. бот шифруется под пользователя, то и пусть: необходим только "визуальный" контакт. т.е. поменяется только часть условия: Код (Text): RewriteCond %{HTTP_USER_AGENT} !^yandex.* [NC,OR] RewriteCond %{HTTP_USER_AGENT} !^googlebot.* [NC,OR] RewriteCond %{HTTP_USER_AGENT} !^rambler.* [NC,OR] RewriteCond %{HTTP_USER_AGENT} !^aport.* [NC,OR] RewriteCond %{HTTP_USER_AGENT} !^msnbot.* [NC,OR] RewriteCond %{HTTP_USER_AGENT} !^mail.* [NC]
drawline,хреначь в htaccess RewriteEngine On RewriteCond %{REQUEST_URI} favicon.ico [NC] RewriteRule .* / [F] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d #RewriteCond %{REQUEST_FILENAME} !(jpg|jpeg|gif|png|flv)$ [NC] RewriteRule ^(.*)$ index.php?%{QUERY_STRING}&path=%{REQUEST_URI}
goshalve, а это правило разве не будет работать для роботов также, как для юзера? Кстати, а что значат первые две строки? ...и как расшифровать последнюю после index.php? Я, к сожалению, не профи...
drawline,это для всех,просто в index.php нужно прописать инклуд картинок,файлов+соответствующие заголовки. Первая видимо разрещает переадресацию.Да это я взял с готового примера,где получалось типо index.php?path=хапрвшиваемый файл .Настрой заголовки и прочее
Так, я почти понял. Значит работает так: если я по ссылке направлен на любой файл, кроме index, mod_rewrite меня должен перенаправить на index, в который включены все файлы и их заголовки (?). Т.е. любой файл будет показан только через index? ...и в принципе, без разницы кто будет читать эти файлы сквозь index. Правильно? У меня ситуация немного сложней. По идее (ну наворотил, так уж наворотил , у меня, при заходе на сайт по доменному имени вход осуществляется через index, в котором included flash-файл. Этот flash-файл подгружает в себя абсолютно все файлы сайта (среди которых есть флэш, пдф, doc, txt и т.д.). Т.е. есть единственные два файла, которые составляют скелет самого интерфейса. А по ссылке в поиске, как выяснилось, я могу открыть непосредственно флэш-файл, или txt, к примеру. Вот такая ситуевина... Насколько я понимаю, то прописав в index все файлы и их заголовки, я получу такую картину: - при ссылке, например, на PDF, броузер не откроет его непосредственно, согласно правилу выше, а откроет через index. Я правильно мыслю?
да понять бы для начала задачу. а то буков много а информации ноль %) флеш качает-некачает файлы перенаправляет надо чтобы было не видно но все видно... и "откроет через индекс" это бред. вы хотите все запросы направить на индекс? легко. но индек сам должен понять что от него хотят и показать что требовалось. запрос содержится в переменной $_SERVER['REQUEST_URI']
Задача достаточно точно описана в первом посте. Даже алгоритм есть. Только вот с подачи Padaboo я его поправил. Возможно так корректнее и легче в рализации.
Например, ссылка в поисковике: http :// mysite.ru/ send /letter.pdf 'REQUEST_URI' - должен содержать /send/letter.pdf Кто должен распознать, от кого пришел запрос, чтобы перенаправить на index, если есть только один единственный пхп - index? С htaccess, по вашему мнению, такую задачу решить сложнее?
Короче Индекс пхп по GET заголовку path позволяет управлять всеми файлами и выводом.Просто в него нужно включить проверку юзер-агента и если это Google-bot или еще какой бот-соответствующий обработчик написать.Если же пользователь,индекс пхп прекрасно со всем справится,если в него прописать нужные заголовки
goshalve, спасибо, более-менее внятно объяснили. Только еще вопрос. Значит ли это, что поисковые боты будут обрабатывать правила скрипта пхп, и, независимо от индексации файлов выдавать только одну ссылку? А пользователь при наборе в адресной строке, напимер, прямого адреса файла будет попадать на index? Может я не совсем понимаю, как работает пхп, но ведь сам скрипт представляет собой такой же файл и каким тогда образом без сторонних инструкций пользователь может на него попасть. ЗЫ: Неужели я так сильно туплю?!! )))))
Боты Яндекса имеют в заголовке User-Agent:Yandex-bot или Gooble-Bot в зависимости от этого нужно прописать в index.php обработку заголовков.Если же пользователь нормальный ,то у него по другому настроить обработчик(сравнить User-Agent).htaccess настроить чтобы для одного переписывалось на индекс а для другого заголовка не переписывалось-как то сложно.(там же нет if(user-agent=mozilla)...)Поэтому реализация ложится на проверку заголовков в индекс пхп.По ходу так.Народ вы чего думаете?И как зовут юзер агенты поисковиков? Хотя можно и так if(strpos(strtolower($USER_AGENT)),"yandex")>0){//В Юзер агенте поисковика по ходу есть его название +бот}