За последние 24 часа нас посетили 17162 программиста и 1628 роботов. Сейчас ищут 1506 программистов ...

mod_rewrite: прошу помощи (ботам - все,userу - только index)

Тема в разделе "Вопросы от блондинок", создана пользователем drawline, 16 фев 2011.

  1. drawline

    drawline Активный пользователь

    С нами с:
    16 фев 2011
    Сообщения:
    8
    Симпатии:
    0
    Адрес:
    СПб
    Впервые столкнувшись с mod_rewrite несколько дней назад уже запутался...
    Задача:
    Необходимо, чтобы:
    - по любой внешней по отношению к mysite.ru ссылке (например, по ссылке в поисковике), указывающей на любой файл, кроме index, пользователь мог перейти только на index;
    - при прямом наборе адреса пользователем на любой файл сайта mysite.ru, переход пользователя мог бы быть только на index;
    - переход пользователя по внутренней ссылке, указывающей на любой файл, принадлежащий сайту mysite.ru, не вызывал бы редиректа на index;
    - НО, необходимо!, чтобы поисковики могли видеть и индексировать все страницы и файлы сайта mysite.ru.

    (сайт лежит в папке основного домена home/mysite.ru).
    CMS - отсутствует! Куки если и могут быть поставлены, то только в index!

    Сперва придумал вот такой алгоритм (надеюсь корректный):
    Код (Text):
    1. IF
    2.      'пользователь'
    3.     AND
    4.      'ссылка не принадлежит mysite.ru'
    5. THEN
    6.     'перенаправить на index.htm'
    7. ELSE
    8.     'разрешить все файлы (только для поисковых роботов)'
    Это то, что получилось наворотить самостоятельно, похожее на мой алгоритм (после 3-х дней мучений):
    Код (Text):
    1. RewriteEngine on
    2. Options +FollowSymlinks
    3. RewriteBase /mysite\.ru/
    4.  
    5. #условие "если ссылка не с mysite.ru":
    6. RewriteCond ${HTTP_REFERER} !^www\.mysite\.ru* [NC,C,NS]
    7. #или так?
    8. RewriteCond ${HTTP_REFERER} !^\www.?\mysite\.ru* [NC,C,NS]
    9.  
    10. #проверка - пользователь или бот (главное - распознать usera):
    11. RewriteCond %{HTTP_USER_AGENT} ^Mozilla.* [NC,OR]
    12. RewriteCond %{HTTP_USER_AGENT} ^Opera.* [NC,OR]
    13. RewriteCond %{HTTP_USER_AGENT} ^Firefox.* [NC,OR]
    14. RewriteCond %{HTTP_USER_AGENT} ^Safari.* [NC,OR]
    15. RewriteCond %{HTTP_USER_AGENT} ^Lynx.* [NC]
    16.  
    17. #теперь правило - при выполнении условий выше направить на index:
    18. Redirect 303 / http://www.mysite.ru
    19. #или так?
    20. RewriteRule ^(.*)$ index.php/$1 [R,L]
    21. #синтаксис в предыдущем и следующих?
    22. RewriteRule ^(.*)|(.*)\.(.*)$ http://www.mysite.ru/$1 [R=permanent,L]
    23. #или так?
    24. RewriteRule (.*) http://www.mysite.ru/$1 [R=permanent,L]
    Поправьте, плз, если что-где не так (там бы еще клиентов, наверное, добавить бы?).

    В коде 4 варианта перенаправления - какой оставить, как было бы правильно?.
    + корректность синтаксиса?

    Насколько необходимо и корректно наличие флагов [C] и [NS] в первом условии?
    Наличие флага [L] в конце правила влияет только на текущее правило?
    можно ли будет после выполнения этого правила поставить еще правила?
     
  2. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    drawline
    а зачем это надо?
    у меня допустим HTTP_USER_AGENT Padaboo 0.1
     
  3. drawline

    drawline Активный пользователь

    С нами с:
    16 фев 2011
    Сообщения:
    8
    Симпатии:
    0
    Адрес:
    СПб
    А что, такую задачу разве только я поставил?
    Не первый раз встречаю этот вопрос.
    Может, с точки зрения профи я пытаюсь извратиться?
    Цель, которую мне необходимо достичь, я написал в самом начале поста. Вход на сайт для любого пользователя должен быть только!! через один файл, но при этом, остальные файлы должны индексироваться поисковиками.

    Padaboo 0.1 - :D - оценил!

    Хорошо, тогда так:
    Код (Text):
    1. ЕСЛИ
    2.     'НЕ бот (выборчно, основные поисковики)'
    3.    И
    4.     'ссылка не принадлежит mysite.ru'
    5. ТОГДА
    6.     'перенаправить на index.php'
    7. ИНАЧЕ
    8.     'разрешить все'
    - условие для ботов вроде чаще встречается?
    - а если к.-л. бот шифруется под пользователя, то и пусть: необходим только "визуальный" контакт.

    т.е. поменяется только часть условия:
    Код (Text):
    1. RewriteCond %{HTTP_USER_AGENT} !^yandex.* [NC,OR]
    2. RewriteCond %{HTTP_USER_AGENT} !^googlebot.* [NC,OR]
    3. RewriteCond %{HTTP_USER_AGENT} !^rambler.* [NC,OR]
    4. RewriteCond %{HTTP_USER_AGENT} !^aport.* [NC,OR]
    5. RewriteCond %{HTTP_USER_AGENT} !^msnbot.* [NC,OR]
    6. RewriteCond %{HTTP_USER_AGENT} !^mail.* [NC]
     
  4. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    drawline

    А разве для ботов не применяется robots.txt ?
     
  5. titch

    titch Активный пользователь

    С нами с:
    18 дек 2010
    Сообщения:
    847
    Симпатии:
    0
    tommyangelo, всё равно есть глупые боты, которые его игнорируют. В его же случае это помогло бы.
     
  6. goshalve

    goshalve Guest

    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}
     
  7. drawline

    drawline Активный пользователь

    С нами с:
    16 фев 2011
    Сообщения:
    8
    Симпатии:
    0
    Адрес:
    СПб
    goshalve, а это правило разве не будет работать для роботов также, как для юзера?
    Кстати, а что значат первые две строки?
    ...и как расшифровать последнюю после index.php?

    Я, к сожалению, не профи...
     
  8. goshalve

    goshalve Guest

    drawline,это для всех,просто в index.php нужно прописать инклуд картинок,файлов+соответствующие заголовки.
    Первая видимо разрещает переадресацию.Да это я взял с готового примера,где получалось типо
    index.php?path=хапрвшиваемый файл .Настрой заголовки и прочее
     
  9. drawline

    drawline Активный пользователь

    С нами с:
    16 фев 2011
    Сообщения:
    8
    Симпатии:
    0
    Адрес:
    СПб
    Так, я почти понял.
    Значит работает так: если я по ссылке направлен на любой файл, кроме index, mod_rewrite меня должен перенаправить на index, в который включены все файлы и их заголовки (?). Т.е. любой файл будет показан только через index? ...и в принципе, без разницы кто будет читать эти файлы сквозь index. Правильно?

    У меня ситуация немного сложней. По идее (ну наворотил, так уж наворотил :), у меня, при заходе на сайт по доменному имени вход осуществляется через index, в котором included flash-файл. Этот flash-файл подгружает в себя абсолютно все файлы сайта (среди которых есть флэш, пдф, doc, txt и т.д.).
    Т.е. есть единственные два файла, которые составляют скелет самого интерфейса. А по ссылке в поиске, как выяснилось, я могу открыть непосредственно флэш-файл, или txt, к примеру. Вот такая ситуевина...

    Насколько я понимаю, то прописав в index все файлы и их заголовки, я получу такую картину:
    - при ссылке, например, на PDF, броузер не откроет его непосредственно, согласно правилу выше, а откроет через index. Я правильно мыслю?
     
  10. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    drawline
    чего-чего?
     
  11. drawline

    drawline Активный пользователь

    С нами с:
    16 фев 2011
    Сообщения:
    8
    Симпатии:
    0
    Адрес:
    СПб
    igordata - вместо издевок помогли бы лучше "белокурой даме". :)))))
     
  12. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    да понять бы для начала задачу. а то буков много а информации ноль %)
    флеш качает-некачает файлы перенаправляет надо чтобы было не видно но все видно...

    и "откроет через индекс" это бред. вы хотите все запросы направить на индекс? легко. но индек сам должен понять что от него хотят и показать что требовалось.

    запрос содержится в переменной $_SERVER['REQUEST_URI']
     
  13. drawline

    drawline Активный пользователь

    С нами с:
    16 фев 2011
    Сообщения:
    8
    Симпатии:
    0
    Адрес:
    СПб
    Задача достаточно точно описана в первом посте. Даже алгоритм есть. :)
    Только вот с подачи Padaboo я его поправил. Возможно так корректнее и легче в рализации.
     
  14. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    тогда я дал ответ. я делаю сайты ТОЛЬКО ТАК со дня знакомства с пхп.
     
  15. drawline

    drawline Активный пользователь

    С нами с:
    16 фев 2011
    Сообщения:
    8
    Симпатии:
    0
    Адрес:
    СПб
    Например, ссылка в поисковике: http :// mysite.ru/ send /letter.pdf

    'REQUEST_URI' - должен содержать /send/letter.pdf

    Кто должен распознать, от кого пришел запрос, чтобы перенаправить на index, если есть только один единственный пхп - index?

    С htaccess, по вашему мнению, такую задачу решить сложнее?
     
  16. goshalve

    goshalve Guest

    Короче Индекс пхп по GET заголовку path позволяет управлять всеми файлами и выводом.Просто в него нужно включить проверку юзер-агента и если это Google-bot или еще какой бот-соответствующий обработчик написать.Если же пользователь,индекс пхп прекрасно со всем справится,если в него прописать нужные заголовки
     
  17. drawline

    drawline Активный пользователь

    С нами с:
    16 фев 2011
    Сообщения:
    8
    Симпатии:
    0
    Адрес:
    СПб
    goshalve, спасибо, более-менее внятно объяснили. Только еще вопрос.
    Значит ли это, что поисковые боты будут обрабатывать правила скрипта пхп, и, независимо от индексации файлов выдавать только одну ссылку?
    А пользователь при наборе в адресной строке, напимер, прямого адреса файла будет попадать на index?
    Может я не совсем понимаю, как работает пхп, но ведь сам скрипт представляет собой такой же файл и каким тогда образом без сторонних инструкций пользователь может на него попасть.

    ЗЫ: Неужели я так сильно туплю?!! :D)))))
     
  18. goshalve

    goshalve Guest

    Боты Яндекса имеют в заголовке User-Agent:Yandex-bot или Gooble-Bot в зависимости от этого нужно прописать в index.php обработку заголовков.Если же пользователь нормальный ,то у него по другому настроить обработчик(сравнить User-Agent).htaccess настроить чтобы для одного переписывалось на индекс а для другого заголовка не переписывалось-как то сложно.(там же нет if(user-agent=mozilla)...)Поэтому реализация ложится на проверку заголовков в индекс пхп.По ходу так.Народ вы чего думаете?И как зовут юзер агенты поисковиков? Хотя можно и так if(strpos(strtolower($USER_AGENT)),"yandex")>0){//В Юзер агенте поисковика по ходу есть его название +бот}