За последние 24 часа нас посетили 18673 программиста и 1702 робота. Сейчас ищут 872 программиста ...

разрешить в htaccess user_agent

Тема в разделе "Настройка веб-сервера", создана пользователем none.exe, 13 дек 2014.

  1. none.exe

    none.exe Новичок

    С нами с:
    13 дек 2014
    Сообщения:
    5
    Симпатии:
    0
    Здравствуйте!
    В файле htaccess на сайте находятся правила такого вида:
    Код (Text):
    1. RewriteCond %{HTTP_USER_AGENT} MJ12bot [OR]
    2. RewriteCond %{HTTP_USER_AGENT} Java [OR]
    3. ...
    4. RewriteRule ^(.*)$ – [F,L]
    Данные правила, судя по всему, блокируют CRON.
    Подскажите, пожалуйста, как сделать, чтобы эти правила не действовали при запросе с определенного ip. Заранее спасибо!
     
  2. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    блокируют крон? джаваботов они блокируют.

    перед ними проверять remote_addr которому не запрещать запросы
     
  3. none.exe

    none.exe Новичок

    С нами с:
    13 дек 2014
    Сообщения:
    5
    Симпатии:
    0
    Ganzal, спасибо. Я просто в htaccess не шарю.
    Там всё дело в строке
    Код (Text):
    1. RewriteCond %{HTTP_USER_AGENT} Wget [OR]
    Пробовал сделать так:
    Код (Text):
    1.  
    2. RewriteCond %{REMOTE_ADDR} !^00\.00\.000\.00
    3. RewriteRule .* / [R=301, L]
    пока что не выходит.
     
  4. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    а весь файл можно увидеть? ну чисто поглядеть как вы мыслите. ибо указанный код не реализует тот алгоритм который я описал выше.
     
  5. none.exe

    none.exe Новичок

    С нами с:
    13 дек 2014
    Сообщения:
    5
    Симпатии:
    0
    Код (Text):
    1.  
    2. <Files ".htaccess">
    3. deny from all
    4. </Files>
    5.  
    6. RewriteEngine On
    7. RewriteBase /
    8. ErrorDocument 404 /404.html
    9. ########################################
    10.  
    11. RewriteCond %{http_host} ^example.com [nc]
    12. RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]
    13.  
    14. #Админка
    15. RewriteRule ^admin.html$ admin/index.php
    16. RewriteRule ^admin/$ admin/index.php
    17.  
    18. #Страницы и компоненты
    19. RewriteRule ^[/]*([-a-zA-Z0-9_=&\/]*)?$ index.php?&whatpage=&$1
    20. RewriteRule ^([-a-zA-Z0-9_]*)?.html$ index.php?whatpage=$1
    21. RewriteRule ^([-a-zA-Z0-9_]*)/?([-a-zA-Z0-9_]*)?.html$ index.php?catpage=$1&whatpage=$2
    22. RewriteRule ^([-a-zA-Z0-9_]*)/?$ index.php?catpage=$1
    23. RewriteRule ^([-a-zA-Z0-9_]*)/?([-a-zA-Z0-9_]*)/?([-a-zA-Z0-9_]*)?.html$ index.php?catpage=$1&subcatpage=$2&whatpage=$3
    24. RewriteRule ^([-a-zA-Z0-9_]*)/?([-a-zA-Z0-9_]*)/?$ index.php?catpage=$1&subcatpage=$2
    25.  
    26. ## Блокировка по USER AGENT:
    27. RewriteCond %{HTTP_USER_AGENT} MJ12bot [OR]
    28. RewriteCond %{HTTP_USER_AGENT} Java [OR]
    29. RewriteCond %{HTTP_USER_AGENT} NjuiceBot [OR]
    30. RewriteCond %{HTTP_USER_AGENT} Gigabot [OR]
    31. RewriteCond %{HTTP_USER_AGENT} Baiduspider [OR]
    32. RewriteCond %{HTTP_USER_AGENT} JS-Kit [OR]
    33. RewriteCond %{HTTP_USER_AGENT} Voyager [OR]
    34. RewriteCond %{HTTP_USER_AGENT} PostRank [OR]
    35. RewriteCond %{HTTP_USER_AGENT} PycURL [OR]
    36. RewriteCond %{HTTP_USER_AGENT} Aport [OR]
    37. RewriteCond %{HTTP_USER_AGENT} ia_archiver [OR]
    38. RewriteCond %{HTTP_USER_AGENT} DotBot [OR]
    39. RewriteCond %{HTTP_USER_AGENT} SurveyBot [OR]
    40. RewriteCond %{HTTP_USER_AGENT} larbin [OR]
    41. RewriteCond %{HTTP_USER_AGENT} Butterfly [OR]
    42. RewriteCond %{HTTP_USER_AGENT} libwww [OR]
    43. RewriteCond %{HTTP_USER_AGENT} Wget [OR]
    44. RewriteCond %{HTTP_USER_AGENT} SWeb [OR]
    45. RewriteCond %{HTTP_USER_AGENT} LinkExchanger [OR]
    46. RewriteCond %{HTTP_USER_AGENT} Soup [OR]
    47. RewriteCond %{HTTP_USER_AGENT} WordPress [OR]
    48. RewriteCond %{HTTP_USER_AGENT} PHP/ [OR]
    49. RewriteCond %{HTTP_USER_AGENT} spbot [OR]
    50. RewriteCond %{HTTP_USER_AGENT} MLBot [OR]
    51. RewriteCond %{HTTP_USER_AGENT} InternetSeer [OR]
    52. RewriteCond %{HTTP_USER_AGENT} FairShare [OR]
    53. RewriteCond %{HTTP_USER_AGENT} Yeti [OR]
    54. RewriteCond %{HTTP_USER_AGENT} Birubot [OR]
    55. RewriteCond %{HTTP_USER_AGENT} YottosBot [OR]
    56. RewriteCond %{HTTP_USER_AGENT} gold\ crawler [OR]
    57. RewriteCond %{HTTP_USER_AGENT} Linguee [OR]
    58. RewriteCond %{HTTP_USER_AGENT} Ezooms [OR]
    59. RewriteCond %{HTTP_USER_AGENT} lwp-trivial [OR]
    60. RewriteCond %{HTTP_USER_AGENT} Purebot [OR]
    61. RewriteCond %{HTTP_USER_AGENT} User-Agent [OR]
    62. RewriteCond %{HTTP_USER_AGENT} kmSearchBot [OR]
    63. RewriteCond %{HTTP_USER_AGENT} SiteBot [OR]
    64. RewriteCond %{HTTP_USER_AGENT} CamontSpider [OR]
    65. RewriteCond %{HTTP_USER_AGENT} ptd-crawler [OR]
    66. RewriteCond %{HTTP_USER_AGENT} HTTrack [OR]
    67. RewriteCond %{HTTP_USER_AGENT} suggybot [OR]
    68. RewriteCond %{HTTP_USER_AGENT} ttCrawler [OR]
    69. RewriteCond %{HTTP_USER_AGENT} Nutch [OR]
    70. RewriteCond %{HTTP_USER_AGENT} bingbot
    71. RewriteRule ^(.*)$ – [F,L]
    72.  
    73. ######### для компонентов есть папка components
    Проблема в блокировки Wget. При удалении этой строки все работает. Но удалить я ее не могу.
    Пробовал перед блокировкой user agent писать:
    Код (Text):
    1.  
    2. RewriteCond %{REMOTE_ADDR} =11\.11\.111\.11
    3. RewriteRule ^(.*)$ http://%{SERVER_NAME}%{REQUEST_URI} [L]
    Опять мимо.
    Я ищу либо код, после которого дальнейшее чтение htaccess завершается, либо код строки c Wget, который проверяет еще и ip.
     
  6. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    а вы сами писали эти правила? например поясните мне смысл строки
    Код (Text):
    1. RewriteRule ^(.*)$ – [F,L]
    вот просто своими словами.
    и потом если не сложно еще прокомментируйте вот эту строку
    Код (Text):
    1. RewriteRule ^(.*)$ http://%{SERVER_NAME}%{REQUEST_URI} [L]
     
  7. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    у меня если что уже код готовый есть. но мне интересно знать направление ваших мыслей.
     
  8. none.exe

    none.exe Новичок

    С нами с:
    13 дек 2014
    Сообщения:
    5
    Симпатии:
    0
    Первая строка должна вызвать 403 ошибку для ботов. Вторая строка, как мне казалось, должна была быть чем-то вроде пустого правила для RewriteRule, а [L] - завершить чтение htaccess. Я уже писал, что не шарю в htaccess, поэтому пока что направление моих мыслей движется в сторону создания двух файлов php на отдельной демке, перенаправляющих cron. Но если у вас есть код для htaccess, то это бы мне очень помогло.
     
  9. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    не, там совсем не то написано. то есть условия может к ботам и относятся но в правиле ничего про ботов нет. а написано там "взять любой символ ноль и более раз .*, от начала строки ^, до конца строки $. не делать рерайта -, запретить F, это последнее правило для этого запроса L". мы не делаем рерайта, зачем нам запоминать лишние совпадения? вполне достаточно:
    Код (Text):
    1. RewriteRule . - [F,L]
    не, там совсем не то написано 2. "взять любой символ ноль и более раз .*, от начала строки ^, до конца строки $. отправить пользователя а адресу http://%{SERVER_NAME}%{REQUEST_URI} то есть по сути просто обновить страницу (и зачем мы тогда вообще адрес по шаблону читали?), это последнее правило для этого запроса L". грубо говоря там написано "с каким бы запросом ты ко мне не пришел - зайди с ним же еще раз". пустое правило будет выглядеть так:
    Код (Text):
    1. RewriteRule . - [L]
    отличие от первого только в отсутствии флага F.
     
  10. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    рабочую версию забыл показать...

    Код (Text):
    1. RewriteEngine On
    2. RewriteBase /
    3.  
    4. RewriteCond %{REMOTE_ADDR} ^127\.0\.0\.1$
    5. RewriteRule .* - [E=IP:OK,E=U:%{REQUEST_URI}]
    6.  
    7. RewriteCond %{ENV:U} ^$
    8. RewriteCond %{HTTP_USER_AGENT} Chrome
    9. RewriteRule .* - [F,L]
    10.  
    11. ###
    12. RewriteCond %{REQUEST_FILENAME} !-d
    13. RewriteCond %{REQUEST_FILENAME} !-f
    14. RewriteCond %{REQUEST_URI} !^/index\.php
    15. RewriteRule .* /index.php?__=1 [L,QSA]

    Код (Text):
    1. RewriteEngine On
    включаем рерайтер.
    Код (Text):
    1. RewriteBase /
    устанавливаем базу адресов, на которую будет набрасываться рерайтер. в нашем случае с самого корня сайта.

    блок 1.
    Код (Text):
    1. RewriteCond %{REMOTE_ADDR} ^127\.0\.0\.1$
    тестируем адрес гостя и если он совпал с нужным...
    Код (Text):
    1. RewriteRule .* - [E=IP:OK,E=U:%{REQUEST_URI}]
    устанавливаем переменную окружения IP в значение OK. для себя я еще устанавливаю переменную окружения U в значение текущего адреса запроса. на решение задачи это не влияет. при этом рерайта никакого не происходит. я взял пустой шаблон .* и "переписал" его "без изменения" -.

    блок 2.
    Код (Text):
    1. RewriteCond %{ENV:IP} ^$
    если переменная окружения IP не установлена или имеет пустое значение... в таком виде она будет если не сработал блок1.
    Код (Text):
    1. RewriteCond %{HTTP_USER_AGENT} Chrome
    и если такой-то агент пользователя... тут вы перечисляете своих ботов.
    Код (Text):
    1. RewriteRule .* - [F,L]
    запрещаем запрос такому клиенту. опять же нам никакого рерайта не надо делать поэтому .* "переписываем" "без изменения" -.

    блок 3. технический.
    Код (Text):
    1. RewriteCond %{REQUEST_FILENAME} !-d
    если преобразованный запрос не является каталогом файловой системы.
    Код (Text):
    1. RewriteCond %{REQUEST_FILENAME} !-f
    если преобразованный запрос не является файлом файловой системы.
    Код (Text):
    1. RewriteCond %{REQUEST_URI} !^/index\.php
    если преобразованный запрос не ссылается на корневой индекс (чуть ниже объясню).
    Код (Text):
    1. RewriteRule .* /index.php?__=1 [L,QSA]
    переписать запрос .* (тут нет шаблона. мне не интересны совпадения) на адрес /index.php, добавить оригинальную строку запроса QSA и закончить работу рерайтера L. фрагмент __=1 добавляет лишнюю переменную в аргументы запроса. не помню зачем его когда-то начал использовать, но с ним удобно видеть что переадресация состоялась корректно. теперь про переадресацию к индексу. у меня отдельный хост для тестирования рерайтов и в корне лежит два файла - индекс который показывает переменные запроса и .htaccess над которым я издеваюсь. если я добавляю файлы/папки - оно начинаем мне их показывать. если закомментировать нужные строки - показывать не будет. позволяет быстро подстроиться под тестирование конкретной задачи. то есть вам весь этот технический блок может быть и не нужен но как дополнительный пример работы с рерайтером - может быть полезен.

    пару замечаний по вашему коду.
    1. зачем такое огромное кол-во правил разбора адреса? с апача на другие серверы будет геморройно переходить. не проще делать редирект на пхп-машину и в ней уже разбирать адрес?
    2. опять же ваши правила не позволяют использовать скажем русский язык в урлах.
    3. перечислять ботов может быть и удобно, но в данном виде это ведь каждый раз поиск подстроки в строке. не проще запихнуть всё в одно регулярное выражение с логикой ИЛИ?
    4. весь этот код НЕ должен лежать в .htaccess. то есть на сервере разработки конечно удобно писать правила без перезапуска сервера. но на продакшне поиск .htaccess занимает лишнее время, которого и без того мало у тормознутого апача. после завершения тестирования все правила из всех .htaccess должны быть записаны в конфигурацию хоста - апач единожды их скомпилирует при запуске. и плюс желательно выключить оверрайд чтоб апач не искал по всему пути файлы .htaccess. то есть если у вас запрошенный адрес /a/b/c и сайт лежит в /var/www/site то апач поищет .htaccess в /(1), /var(2), /var/www(3), /var/www/site(4), /var/www/site/a(5) /var/www/site/a/b(6) /var/www/site/a/b/c(7). а если найдет то еще сравнить с кэшированной копией надо. в общем лишние телодвижения.
     
  11. none.exe

    none.exe Новичок

    С нами с:
    13 дек 2014
    Сообщения:
    5
    Симпатии:
    0
    Большое спасибо за помощь! Всё заработало!
    Перечитал несколько раз ваш комментарий (искал знакомые слова).
    Вот это для меня осталось загадкой (то есть я совершенно не представляю, как это реализовано):
    В остальном всё доступно) Еще раз БОЛЬШОЕ СПАСИБО!
     
  12. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    реализовано просто. есть каталог на сервере, в котором лежит два файла - index.php и .htaccess. на этот каталог настроена директива virtualhost принимающая запросы на удобном домене и всех субдоменах. то есть можно играться с вариантами субдоменов, менять пусть запроса, менять аргументы - всё будет обработано одним файлом. и естественно можно менять .htaccess (ведь ради него хост и висит) и следить за тем как меняется поведение хоста. плюс естественно настроено журналирование рерайтера что помогает значительно быстрее написать корректный алгоритм рерайта.

    грубо говоря можно делать эти же действия на каждом домене где нужно, но это надо сначала настроить, потом убрать когда закончил играться. туда-сюда дергать настройки хоста не комильфо. намного удобнее иметь отдельную песочницу, в которой всё тестируется и уже потом просто переносится в конфигурацию боевого хоста. и ещё её плюс в том что не нужно менять настройки и перезапускать апач. правим .htaccess, создаем-удаляем каталоги-файлы если играемся с их наличием. и так далее.

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

    не за что. ждем вас снова.