• Математика для разработки игр. Что посоветуете?

    erniesto77
    @erniesto77
    oop, rb, py, php, js
    Надо искать статьи вроде этой Линейная алгебра для разработчиков игр, тут важно понять самые основные точки соприкосновения игр и математики. Пробуй симулировать природные процессы (например гравитацию, ветер), и в процессе практики будут накапливаться именно те знания, которые необходимы для разработки игр. А изучать высшую математику времени не напасешься, эти знания успеешь набрать в институте.
    Тут больше статей с переводами
    Ответ написан
    1 комментарий
  • Вопросы по быстродействию + Какую базу лучше всего использовать?

    Подумайте - не сможете ли вы обойтись NoSQL. Если нет - PostgreSQL + NoSQL хранилище. Я бы взял Redis.
    Ответ написан
    Комментировать
  • Как изменить стиль сайдбара в Sublime Text?

    lazalu68
    @lazalu68
    Salmon
    Нажмите на Preferences -> Browse packages, попадете в папку Packages. В ней вам надо зайти в папку Theme - Default и найти файлик Default.sublime-theme. В этом файлике вам нужно править объекты у которых поле class соответствует маске sidebar_*

    Например так:
    ...
    {
        "class": "sidebar_container",
        // $base02:    #073642         
        "layer0.tint": [7,54,66],
        "layer0.opacity": 1.0,
        "layer0.draw_center": false,
        "layer0.inner_margin": [0, 0, 1, 0],
        "content_margin": [0, 0, 1, 0]
    },
    {
        "class": "sidebar_tree",
        "row_padding": [8, 3],
        "indent": 12,
        "indent_offset": 17,
        "indent_top_level": false,
        // $base2:     #eee8d5         
        "layer0.tint": [238,232,213],
        "layer0.opacity": 1.0,
        "dark_content": false
    },
    {
        "class": "sidebar_heading",
        // $base1:     #93a1a1         
        "color": [147,161,161],
        "font.bold": true,
        // $base3:     #fdf6e3         
        "shadow_color": [253,246,227],
        "shadow_offset": [0, 1]
    },
    {
        "class": "sidebar_heading",
        "parents":
        [
            { "class": "tree_row", "attributes": ["selected"] }
        ],
    
        "shadow_color": [160, 174, 192]
    },
    {
        "class": "sidebar_label",
        // $base01:    #586e75         
        "color": [88,110,117],
        "font.bold": false
        // , "shadow_color": [250, 250, 250], "shadow_offset": [0, 0]
    },
    {
        "class": "sidebar_label",
        "parents": [{"class": "tree_row", "attributes": ["selected"]}],
        // $base01:    #586e75         
        "color": [88,110,117]
        // , "shadow_color": [60, 60, 60], "shadow_offset": [0, 1]
    },
    
    {
        "class": "sidebar_label",
        "parents": [{"class": "tree_row", "attributes": ["expandable"]}],
        "settings": ["bold_folder_labels"],
        "font.bold": true
    }
    ...


    Только этот код не добявляйте, это код для светлого сайдбара xD

    Гляньте этот или этот

    Ах да, вы же хотите еще чтоб он вам тип файлика показывал)

    Вот тут лежит приличный список тем для саблайма, например с 15 по 20 темы имеют обозначения типов файлов, но они какие-то очень уж дефолтные. Я не нашел инфы о готовом решении по кастомизации иконок, но, думаю, вам не составит особых трудов добраться до папки с иконками и до конфига, который связывает иконки и типы файлов)

    Вот тут целая куча иконок для саблайма, и все они там очень похожи на те, что вы заскринили. Я даже думаю, что это именно те. Инструкция по установке там же.

    Вся моя писанина, кажется, не имела смысла - парень ниже дал ссылку на тему, которая по дефолту юзает иконки из вашего скрина)

    Кажется по дефолту только третий саблайм умеет юзать иконки, так что если у вас на втором саблайме их нет, то просто поставьте Sublime Text 3 и накатите на него эту тему . После установки темы может показаться что вам подсунули фальшивку и это гавно (которое вы поставили) следует срочно удалить. Я не знаю, зачем разработчик темы сделал это, но с самого начала она выглядит... немного странно. Инструкция как сделать из этой темы то, что вы видите на скринах, лежит там же, на гите.
    Ответ написан
  • Как командно разрабатывать php проект?

    copist
    @copist
    Empower people to give
    Инфраструктура
    * Создайте репозиторий на Bitbucket или GitHub.
    * Создайте себе локально копию репозитория и локально поднимите базу данных с одинаковой структурой
    * Если в базе требуются изменения, создавайте "миграции", которые обновят структуру данных или сами данные.
    * Свои изменения по коду, так же как и миграции, отправляйте в репозиторий

    Ещё есть возможность создания виртуальных серверов для разработки или использование online IDE. Решает кучу проблем, если интернет быстрый.
    * https://compilr.com/ Полноценная среда разработки
    * https://koding.com/ Среда разработки с предустановленным веб-сервером и элементами социальной сети
    * online-php.com Online IDE
    * https://codeanywhere.com/ Среда разработки. Код можно хранить в облаке, а также в Dropbox, Google Drive, FTP, github.
    Другие тулзы для совместной работы в online

    Промежуточные версии
    Если вы географически недалеко друг от друга, то просто периодически показывайте, что у вас получается.
    Если нет, пользуйтесь Skype Shared Screen, Join.me и другие аналогичные продукты, чтобы вместе смотреть и обсуждать голосом. А лучше TeamViewer, чтобы можно было вместе и посмотреть, и поправить.

    Обновление сервера
    Изменения на сервер устанавливайте из того-же репозитория. Не забудьте про миграции. Озаботьтесь вопросами безопасности. Хотя бы так: скрыть файлы .git
    Ответ написан
    Комментировать
  • Как сделать простой php маршрутизатор (роутер)?

    devg
    @devg
    I am Yenior software developer
    Очень простой роутер, не без недостатков, но довольно быстрый и легко использовать, дописывать под себя.

    <?php
    /**
     * Простой роутер
     * @devg
     */
    final class RouterLite {
    
      public static $routes = array();
      private static $params = array();
      public static $requestedUrl = '';
    
      /**
       * Добавить маршрут
       */
      public static function addRoute($route, $destination=null) {
        if ($destination != null && !is_array($route)) {
          $route = array($route => $destination);
        }
        self::$routes = array_merge(self::$routes, $route);
      }
    
      /**
       * Разделить переданный URL на компоненты
       */
      public static function splitUrl($url) {
        return preg_split('/\//', $url, -1, PREG_SPLIT_NO_EMPTY);
      }
      
      /**
       * Текущий обработанный URL
       */    
      public static function getCurrentUrl() {
        return (self::$requestedUrl?:'/');
      }
    
      /**
       * Обработка переданного URL
       */
      public static function dispatch($requestedUrl = null) {
    
          // Если URL не передан, берем его из REQUEST_URI
          if ($requestedUrl === null) {
            $uri = reset(explode('?', $_SERVER["REQUEST_URI"]));
            $requestedUrl = urldecode(rtrim($uri, '/'));
          }
    
          self::$requestedUrl = $requestedUrl;
    
          // если URL и маршрут полностью совпадают
          if (isset(self::$routes[$requestedUrl])) {
            self::$params = self::splitUrl(self::$routes[$requestedUrl]);
            return self::executeAction();
          }
    
          foreach (self::$routes as $route => $uri) {
            // Заменяем wildcards на рег. выражения
            if (strpos($route, ':') !== false) {
              $route = str_replace(':any', '(.+)', str_replace(':num', '([0-9]+)', $route));
            }
    
            if (preg_match('#^'.$route.'$#', $requestedUrl)) {
              if (strpos($uri, '$') !== false && strpos($route, '(') !== false) {
                $uri = preg_replace('#^'.$route.'$#', $uri, $requestedUrl);
              }
              self::$params = self::splitUrl($uri);
                
              break; // URL обработан!
            }
          } 
          return self::executeAction();
      } 
    
     /**
       * Запуск соответствующего действия/экшена/метода контроллера
       */
      public static function executeAction() {
        $controller = isset(self::$params[0]) ? self::$params[0]: 'DefaultController';
        $action = isset(self::$params[1]) ? self::$params[1]: 'default_method';
        $params = array_slice(self::$params, 2);
    
        return call_user_func_array(array($controller, $action), $params);
      }
    
    }
    ?>


    Пример использования:
    <?php
    // маршруты (можно хранить в конфиге приложения)
    // можно использовать wildcards (подстановки):
    // :any - любое цифробуквенное сочетание
    // :num - только цифры
    // в результирующее выражение записываются как $1, $2 и т.д. по порядку
    
    $routes = array(
      // 'url' => 'контроллер/действие/параметр1/параметр2/параметр3'
      '/' => 'MainController/index', // главная страница
      '/contacts' => 'MainController/contacts', // страница контактов
      '/blog' => 'BlogController/index', // список постов блога
      '/blog/:num' => 'BlogController/viewPost/$1' // просмотр отдельного поста, например, /blog/123
      '/blog/:any/:num' => 'BlogController/$1/$2' // действия над постом, например, /blog/edit/123 или /blog/dеlete/123
      '/:any' => 'MainController/anyAction' // все остальные запросы обрабатываются здесь
    ));
    
    // добавляем все маршруты за раз
    RouterLite::addRoute($routes);
    
    // а можно добавлять по одному
    RouterLite::addRoute('/about', 'MainController/about');
    
    // непосредственно запуск обработки
    RouterLite::dispatch();
    ?>


    UPDATE (07.08.2017):
    Дальнейшее развитие данного роутера см. в проекте Litero (https://github.com/bit55/litero)
    Ответ написан
    1 комментарий
  • Как сделать ЧПУ при помощи PHP?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    Это странно, код правильный, у меня такой работает.
    От себя могу порекомендовать все таки вместо
    RewriteRule ^(.*) index.php?%{QUERY_STRING}
    использовать конструкцию вида
    RewriteRule ^(.*)$ index.php?q=$1 [QSA,L]
    Ответ написан
    2 комментария
  • Вероятностные алгоритмы: какие бывают и где найти полный их список?

    begemot_sun
    @begemot_sun Автор вопроса
    Программист в душе.
    Здесь буду собирать ссылки на вероятностные алгоритмы:
    1. Фильтр блума https://ru.wikipedia.org/wiki/%D0%A4%D0%B8%D0%BB%D...
    2. MinHash habrahabr.ru/post/115147
    3. LogLog: находим число уникальных элементов -- habrahabr.ru/post/119852
    3.1 HyperLogLog
    4. Поиск похожих документов с MinHash + LHS: habrahabr.ru/post/250673
    5. https://en.wikipedia.org/wiki/Count%E2%80%93min_sketch -- приближенный сбор частот событий в потоке.
    6. Алгоритм Рабина — Карпа: поиск подстрок в строке через хеширование. https://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D...

    https://en.wikipedia.org/wiki/Category:Probabilist...
    Ответ написан
    Комментировать
  • Java vs C++. Что полезнее?

    @ProkletyiPirat
    смотря что считать "распространенными задачами" ...

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

    так например на Java в сравнении с C++ проще и быстрее писать кросс платформенные приложения или много поточные приложения и при этом они будут работать быстрее C++, но зато когда дело касается железок или объёмной работы над памятью то на С++ писать быстрее и проще и работать будет быстрее чем Java.

    а весь цимес в том что не надо говорить "Java" или "C++", надо говорить "Java" и "C++", за счёт того что есть JNI вы спокойно можете вынести все нагруженные вычисления в С\С++, а в Java оставить всё остальное, и получить лучшее из двух миров.
    Ответ написан
    Комментировать
  • Связка Nginx+Apache. Странное поведение virtual hosts - почему?

    nowm
    @nowm
    Я сначала немного «теории» опишу, а в конце скажу, что в ваших конфигах нужно поправить.

    Вообще, у вас Apache не должен принимать никаких запросов от сторонних серверов. Связка Apache + Nginx делается потому, что Nginx очень хорошо отдаёт статичный контент, а Apache выигрывает в работе с PHP. К тому же, Apache даёт возможность использовать файлы .htaccess, которые позволяют очень гибко конфигурировать работу на уровне директорий одного сервера.

    Так вот. Суть связки Apache + Nginx в том, что Apache обрабатывается входящие запросы только от одного сервера. Обычно они оба ставятся на одной машине, и в этом случае Apache должен принимать запросы только от 127.0.0.1. Он не должен заботиться о том, чтобы обрабатывать имена dev1.site, dev2.site и так далее. Эта задача лежит на Nginx, который будет перенаправлять внешние запросы соответствующим образом.

    Для этого Apache конфигурируется таким образом, чтобы каждый его виртуальный хост слушал свой порт. Например, я строю всю систему таким образом, чтобы у меня было два сервера: task.site и dev.site. Для этого я делаю так:

    /etc/apache2/ports.com:
    NameVirtualHost 127.0.0.1:8080
    NameVirtualHost 127.0.0.1:8090
    Listen 127.0.0.1:8080
    Listen 127.0.0.1:8090


    Это значит, что у меня будет два инстанса, один из которых будет обслуживать имя dev.site, а другой — task.site (при этом, сам Apache как бы будет не в курсе, какой он домен обслуживает. Он знает только что запрос на порт 8080 нужно так обработать, а на 8090 — ещё как-то). Всё, что теперь от апача понадобится — сделать виртуальные хосты, чтобы определить папки, из которых будут вызываться скрипты для каждого из сайтов.

    /etc/apache2/sites-enabled/default.conf:
    <VirtualHost 127.0.0.1:8090>
    	. . .
    	DocumentRoot /usr/share/redmine/public
    	. . .
    </VirtualHost>
    <VirtualHost 127.0.0.1:8080>
    	. . .
    	DocumentRoot /var/www/dev.site
    	. . .
    </VirtualHost>


    Всё. Если запрос будет на 127.0.0.1:8080, то будут выполняться скрипты из папки /var/www/dev.site. Если на 127.0.0.1:8090, то — /usr/share/redmine/public. Сам Apache вообще не в курсе, какие он домены обслуживает, так как снаружи его не видно.

    Далее вступает в работу Nginx. Он отвечает за то, чтобы определить по имени сайта, куда отправлять запрос.

    /etc/nginx/sites-available/default.conf:
    server {
    	listen 80;
    	server_name dev.site;
    	server_name_in_redirect off;
    
    	location / {
    		proxy_pass http://127.0.0.1:8080/;
    		proxy_redirect off;
    		proxy_set_header Host $host;
    		proxy_set_header X-Real-IP $remote_addr;
    		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    		client_max_body_size 10m;
    		proxy_connect_timeout 90;
    	}
    }
    
    server {
    	listen 80;
    	server_name task.site;
    	server_name_in_redirect off;
    	
    	location / {
    		proxy_pass http://127.0.0.1:8090/;
    		proxy_redirect off;
    		proxy_set_header Host $host;
    		proxy_set_header X-Real-IP $remote_addr;
    		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    		client_max_body_size 10m;
    		proxy_connect_timeout 90;
    	}
    }


    Как видно из листинга, он для dev.site делает proxy_pass http://127.0.0.1:8080/, а для task.siteproxy_pass http://127.0.0.1:8090/.

    Теперь о том, что нужно поправить в ваших конфигах. В апаче нужно все сервера раскидать по отдельным портам. Сначала нужно прописать NameVirtualHost и Listen для каждого из них. При этом, обязательно нужно указывать не *:8080 или *:8081, *:8082, а конкретно 127.0.0.1:8080, 127.0.0.1:8081 и т.п., потому что «*» позволяет делать прямые запросы с любой машины, а «127.0.0.1» разрешает принимать соединения только с localhost.

    То же самое — в блоках VirtualHost. Вместо <VirtualHost *:8080> нужно писать <VirtualHost 127.0.0.1:8080>

    Из блока VirtualHost нужно выкинуть ServerName и ServerAlias, так как всё это будет обрабатываться на уровне Nginx.

    В итоге вы получите такую ситуацию, что напрямую у вас sub.myhost.ru:8080 открываться не будет, так как Apache принимает запросы только от localhost. Он будет открываться только по запросу от Nginx, который будет определять какой сервер куда проксировать.

    В вашем конфиге Nginx вместо server_name *.myhost.ru; нужно писать полное имя хоста. И для каждого хоста нужно создать отдельный блок server {}.

    В конфигах Nginx ещё не забудьте приписать обработку статики (хотя у вас она и так прописана). Я из листинга этот момент выкинул, но его вообще нужно добавить, потому что одна из прелестей Nginx — как раз обработка статики. В каждый блок server {} можно добавить что-нибудь вроде:

    location ~* ^.+\.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|js|pdf)$ {
    	root /var/www/dev.site;
    }


    И далее, если вы хотите добавить подсервер: создаёте виртуальный хост апача на свободном порту, а в Nginx добавляете для него блок server {}.

    В данный момент у вас просто небольшая каша получилась в конфигах.
    Ответ написан
    8 комментариев
  • Как реализовать Websocket клиент на PHP?

    $client = stream_socket_client($this->config['websocket'], $errorNumber, $errorString, 1);
    fwrite($client, "GET / HTTP/1.1\r\nHost: localhost\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Key: tQXaRIOk4sOhgoq7SBs43g==\r\nSec-WebSocket-Version: 13\r\n\r\n");
    Ответ написан
    Комментировать
  • На базе чего можно грамотно организовать совместную разработку для маленькой команды?

    vmpartner
    @vmpartner
    In code we trust
    Для маленькой группы для начала хватит:
    1. BitBucket
    2. Trello
    3. NetBeans / PhpStorm / Sublime Text (Фавориты среди редакторов на мой взгляд )
    4. Skype
    Ответ написан
    1 комментарий
  • Отказ от apache в связке nginx + httpd + php?

    @hell
    Боюсь, что огребу за свой совет кучу минусов, но тем не менее:

    Месяца три назад, я 2 недели посвятил тестам — что лучше. Правда — у меня стоял PHP 5.4, nginx 1.2 и все это на Debian
    Тестировал (и, разумеется, в процессе тестов тюнил ОС и все прочие настройки) четыре варианта — nginx+PHP, nginx+ahache+PHP, nginx+nginx+PHP (в последнем случае есть внешний нгинкс, работающий со статикой и отправляющий запросы к PHP на внутренний нгинкс) и nginx+apache+PHP-FPM.

    Внутренние нгинкс и апач запускаются в режиме keepAlive off
    У апача отрублено все лишнее (в моем случае оставлены dir, auth, mime, rpaf). ,haccess не используется (если че-то нужно органичить — ставим напрямую в конфигах сайта, все перенаправления — через внешний нгинкс)
    У внешнего нгинкса включен gzip, отключено кеширование
    Внутренние сервера логируют только ошибки php

    Во всех случаях на реальные сайты натравливался siege с увеличенным таймаутом и с 1000 конкурентных запросов.

    Да — и машинка — Хетзнеровская с 24 GB памяти.

    Результаты получились следующие:

    nginx + php — не котируется вообще. выводит память в свап, нагрузка в top — 140 — 150 примерно через минуту после начала осады. Манипуляции с системой и настройками не помогли.

    nginx+apache+php-fpm — жрет память и залезает в свап, процессор особо не грузит. Есть проблемы со стабильностью (siege стабильно отрабатывал с параметром не более -c 500)

    nginx+apache+php и nginx+nginx+php — примерно одинаковые результаты — средняя нагрузка в top — 3, среднее потребление памяти — 14 — 16 Gb. Количество транзакций также примерно одинаково (apache показывал результаты примерно на 3-4 транзакции в секунду лучше)

    nginx+nginx+php работал чуть менее стабильно, чем nginx+apache+php (не чуть, даже — чуть-чуть — то есть пару тройку раз сокет все-таки падал, а в случае apache тaкого не было)

    Пришлось остановиться на классике (хотя очень хотелось ограничиться nginxом)

    Впрочем — это все — лирика. Я бы рекомендовал провести серию тестов с вашим софтом (и с вашим админом) — возможно вы получите другие результаты. Впрочем — и это почти наверняка — вариант с реверс-прокси будет заведомо более производительным.
    Ответ написан
    2 комментария
  • Как реализовать хранение друзей в БД?

    difiso
    @difiso
    В параллельной вселенной я космонавт
    А что если хранить немного по другому?

    Например не создавать дублирующую запись в обратную сторону, а изначально использовать еще одно поле в троичной системе счисления: ± 1 когда один пользователь добавил другого (знак указывает направление заявки) и 0 когда заявка подтверждена.

    Тогда запрос будет один на выборку пары, а состояния отозвать/принять заявку и удалить из друзей будут определяться знаком числа в дополнительном поле.

    Из очевидных плюсов. Места занимать будет примерно в два раза меньше — мелочь, а приятно.
    Минусов не сразу не соображу.
    Ответ написан
    3 комментария
  • Реализация многоязычности в PHP?

    @max_rip
    мне нравится вариант когда
    $lang['mTitle']='Главная';
    $lang['mAbout']='О нас';

    Сначала вызывается язык оригинала, а потом текущий язык, если он отличается от оригинала. Таким образом, если перевода и не будет, то можно получить хоть что-то.
    Хотя в php успешно используют gettext(например в phpmyadmine), но его более сложно ввести. Требуются утилиты, коих предостаточно для различных систем.
    Ответ написан
    Комментировать
  • Самый простой способ выдавать мобильную версию сайта на php

    Phelix
    @Phelix
    SEO, Веб-анализ, Анализ данных
    Попробуйте в .htaccess прописать следующее

    RewriteEngine on

    RewriteCond %{HTTP_USER_AGENT} acs [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} alav [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} alca [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} amoi [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} audi [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} aste [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} avan [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} benq [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} bird [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} blac [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} blaz [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} brew [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} cell [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} cldc [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} cmd- [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} dang [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} doco [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} eric [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} hipt [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} inno [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} ipaq [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} java [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} jigs [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} kddi [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} keji [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} leno [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} lg-c [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} lg-d [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} lg-g [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} lge- [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} maui [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} maxo [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} midp [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} mits [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} mmef [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} mobi [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} mot- [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} moto [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} mwbp [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} nec- [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} newt [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} noki [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} opwv [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} palm [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} pana [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} pant [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} pdxg [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} phil [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} play [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} pluc [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} port [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} prox [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} qtek [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} qwap [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} sage [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} sams [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} sany [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} sch- [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} sec- [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} send [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} seri [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} sgh- [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} shar [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} sie- [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} siem [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} smal [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} smar [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} sony [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} sph- [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} symb [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} t-mo [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} teli [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} tim- [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} tosh [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} tsm- [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} upg1 [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} upsi [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} vk-v [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} voda [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} w3cs [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} wap- [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} wapa [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} wapi [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} wapp [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} wapr [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} webc [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} winw [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} winw [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} xda [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} xda- [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} up.browser [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} up.link [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} windows.ce [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} iemobile [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} mini [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} mmp [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} symbian [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} midp [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} wap [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} phone [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} pocket [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} mobile [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} pda [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} PPC [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} Series60 [NC,OR]

    RewriteCond %{HTTP_USER_AGENT} Opera.Mini [NC]

    RewriteCond %{HTTP_USER_AGENT} !windows.nt [NC]

    RewriteCond %{HTTP_USER_AGENT} !bsd [NC]

    RewriteCond %{HTTP_USER_AGENT} !x11 [NC]

    RewriteCond %{HTTP_USER_AGENT} !unix [NC]

    RewriteCond %{HTTP_USER_AGENT} !macos [NC]

    RewriteCond %{HTTP_USER_AGENT} !macintosh [NC]

    RewriteCond %{HTTP_USER_AGENT} !playstation [NC]

    RewriteCond %{HTTP_USER_AGENT} !google [NC]

    RewriteCond %{HTTP_USER_AGENT} !yandex [NC]

    RewriteCond %{HTTP_USER_AGENT} !bot [NC]

    RewriteCond %{HTTP_USER_AGENT} !libwww [NC]

    RewriteCond %{HTTP_USER_AGENT} !msn [NC]

    RewriteCond %{HTTP_USER_AGENT} !america [NC]

    RewriteCond %{HTTP_USER_AGENT} !avant [NC]

    RewriteCond %{HTTP_USER_AGENT} !download [NC]

    RewriteCond %{HTTP_USER_AGENT} !fdm [NC]

    RewriteCond %{HTTP_USER_AGENT} !maui [NC]

    RewriteCond %{HTTP_USER_AGENT} !webmoney [NC]

    RewriteCond %{HTTP_USER_AGENT} !windows-media-player [NC]

    RewriteCond %{QUERY_STRING} !wpc_nr [NC]

    RewriteRule ^(.*)$ site.ru/ [L,R=302]


    Не помню, откуда список юзерагентов взял. но использовал в свое время именно это.
    Ответ написан
    Комментировать