+3.20
Рейтинг

Виталий Никсенкин

Редирект в зависимости от ip

.htaccess
RewriteEngine On 
RewriteCond %{HTTP_ACCEPT_LANGUAGE} de.* [NC,OR] 
RewriteCond %{HTTP_ACCEPT_LANGUAGE} de-ch.* [NC,OR] 
RewriteCond %{HTTP_ACCEPT_LANGUAGE} at.* [NC,OR] 
RewriteCond %{HTTP_ACCEPT_LANGUAGE} en-gb.* [NC,OR] 
RewriteCond %{HTTP_ACCEPT_LANGUAGE} de-at.* [NC,OR] 
RewriteCond %{HTTP_ACCEPT_LANGUAGE} de-li.* [NC,OR] 
RewriteCond %{HTTP_ACCEPT_LANGUAGE} fr-ch.* [NC,OR] 
RewriteCond %{HTTP_ACCEPT_LANGUAGE} ch.* [NC,OR] 
RewriteCond %{HTTP_ACCEPT_LANGUAGE} de-de.* [NC,OR] 
RewriteRule .* http://google.com [R,L]


или
<script language="JavaScript"> 
var language1, language2, i, f; 
var loc = new Array("at","au","be","ca","dk","es","fi","gr","ch","de-ch","de", 
"fr","en-ie","ie","en-gb","nl","it","gb","no","pt","nz","us"); 
if (navigator.appName.indexOf("Microsoft") != -1) { 
language1=navigator.systemLanguage.toLowerCase(); 
language2=navigator.userLanguage.toLowerCase(); 
} else { language1=language2=navigator.language.toLowerCase(); } 
for (f=false,i=0;i<loc.length;i++) { if ((language1 == loc[i]) 
|| (language2 == loc[i])) { f = true; break; } } 
if (f) window.open("http://page_with_toolbar_code"); 
</script>


Настроить под себя.

Хостинги под бэкапы

Из моих наблюдений, лучший по цене, и надежности/приватности это fornex.com/backup.


При покупке такого(если у вас нету резервых серверов например), нада обращать внимание на скорость канала. Ибо иногда чтобы скачать бекап, нужно 4 часа :) Так что, скорость канала — самое важное, наверно.
*а еще, иногда можно просто заказать услугу дополнительную, у того же хостера, где покупаете VDS или сервер. хотя не у всех есть, но если такая услуга присутствует, то проще всего делать именно так.

Ну или, делите свои бекапы на части. Не нужно целый vds бекапить одним архивом. А лучше разделите на каждого пользователя.

Inferno Solutions



Промокоды:
LINUX50 — скидка 50% на весь срок аренды Linux VPS в Германии и США (до конца 2011 года)
EST50 — скидка 50% на весь срок аренды в Эстонии (до конца 2011 года)
Чтобы получить +1 месяц аренды в подарок, укажите в примечании к заказу код 1+FREE (до конца ноября)
50PROMO — 50% на первый месяц аренды любого VPS сервера
Windows VPS в Германии — скидка 25% Код — WIN25

Плюсы, которые есть у них
  • VPS работают на платформе XEN, что полностью исключает возможность оверселлинга.
  • Главный плюс, этой конторы, их серверы и VPS практически под любые цели, кроме откровенного нелегала (вирусы, взломы и т.п)
  • Торрент-трэкеры, варезники и другие нарушители авторского права — велам
  • Первоначальная настройка вашего сервера включается в тарифы.
  • Круглосуточная поддержка и администрирование включены в стоимость.
  • Ресселеры, как fastvps.ru, наивысшего уровня — напрямую с ДЦ
От себя, скажу, что рекомендую именно как самый лучший ресурс, где можно закупить сервера, куда будут абузы всякие присылаться. Тут самая наивысшая живучесть такого рода.

Минусы очевидно, официальная работа с ЮЛ и все такое. Если вам это важно, то пиздуйте на мастерхосты, заточенные под нубов. И общение с тех поддержкой тут тоже, на уровне интернета, если вы мудак и будете ебать мозги(как нуб), то вам вообще могут не продать хостинг, ибо тут с гемороем не связываются.
Тем, кто знает, зачем им сервер, или VDS — именно для таких вот клиентов, я советую юзать Inferno
Или можете, использовать эту контору, как одну из локаций, если захотите ресселить хостинг(без участия ДЦ/ЮЛ/т.д.)

Бесплатные домены третьего уровня



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

  • 1nya.ru
  • kofeyko.ru
  • 2me.be
  • a404.ru
  • csnsk.ru
  • time2kill.ru
  • Nixe.me
  • nyanyu.ru
  • tsunddere.ru
  • animeotaku.ru
  • nyashechka.ru
  • 1010011010.ru
  • a2k.in
  • a13.in

Т.е. например, вы хотите olesya.1nya.ru, пишите это в комментах, указываете NS сервера, или ip хостинга. И я его создаю ;)

Просьбы направлять на alice2k@abcd.bz

Бесплатные DNS хостинги

Решил, тут написать обзоров.
Можно получить бесплатный dns хостинг, у хостеров.

Потом, в будущем, буду дописывать в комменты, еще подобные места.
Выбор за вами. Какой менеджер, для управления вам нравится, тем и пользуйтесь.
Раньше я был всецело за yandex, но даже он упал, как вы знаете. Так что, идеальности не существует.

Мегаплан. Появление халявных тарифов



Как вы знаете, до этого там были только платные продукты.
Но теперь, они запустили пару бесплатных тарифов.
Таск-менеджер Free: совместная работа, постановка и контроль задач и проектов, планирование дел, управление структурой компании и другие фишки.
CRM Free: клиенты и продажи, воронки продаж и другие отчеты, совместная работа и задачи, счета и финансовый учет.
Вообщем, все как и раньше. Но с ограничениями.
  • 3 лицензии (три человека одновременно могут быть в системе);
  • 200 активных сделок;
  • 100 выставленных счетов;
  • 500 активных задач;
  • 50 активных проектов;
  • 7 активных сотрудников (уволенные в расчет не берутся)
Регаться, читать и вникать тута

2ns.info - листинг доменов

2ns.info


Плюшки

Самое полезное, это блокнот доменов. С ним вы никогда не забудете продлить или перехватить освободившейся домен. ;)

domains.alice2k.ru

domains.alice2k.ru

По партнерке от domaincontext.com, так что не проебутся. (если партнер отчаливает даже, через 5 лет, то через их оф сайт можно всегда получить доступ)
Оформлено, через Михея, с бывшего zloy.org еще(ну с 2009 там .bz, когда Терминатор продал Злой).
регистрация доменов

Собсно панели как обычно. Управление зоной присутствует. Разве что для нубов проще.




Класс для загрузки файлов на сервер

Пример как использовать:
if (!empty($_FILES)) {
$tempFile = $_FILES['Filedata']['tmp_name'];
$targetPath = '/public/galery/';
$upload = new Upload(str_replace('//', '/', $targetPath));

if ($upload->uploads($_FILES['Filedata'])) {
$fileInfo = $upload->getFilesInfo();
$fileInfo["nameTranslit"];// новое имя файла, можно записать в БД
}
}

Ну и собственно сам класс
class Upload {

    private $dir = "/";
    private $name;
    private $FILES;
    private $allowedType = array("jpg", "gif", "bmp", "jpeg", "png", "pps","doc","docx","xls","pdf","txt","rar","zip");
    private $errors;
    private $errorsMessage = array(1 => "Размер загружаемого файла превышает допустимый размер.",
        2 => "Размер загружаемого файла превышает допустимый размер.",
        3 => "Файл был загружен лишь частично.",
        4 => "Файл не был загружен.",
        6 => "Файл не был загружен.",
        7 => "Файл не был загружен.",
        8 => "Файл не был загружен.");

    function __construct($dir="/") {
        $this->dir = $dir;
    }

    /**
     * устанавливаем дирректорию загрузки файла
     */
    function setDir() {
        $this->dir = $dir;
    }

    /**
     * Устанавлиаем доступные расширения
     * @param <type> $type
     */
    function setAllowedType($type) {
        if (is_array($type)) {
            $this->allowedType = $type;
        } else {
            $this->allowedType = explode(",", $type);
        }
    }

    /**
     * загрузка файла
     * @param $tmpName
     * @param $name
     * @param $replacement
     */
    private function upload($tmpName, $name) {
        $name = $this->substitute(self::translit($name));

        if ($this->typeChecking($name))
            if (move_uploaded_file($tmpName, $this->dir . $name)) {
                return $name;
            } else {
                return false;
            }
        return false;
    }

    function uploads($FILES) {
        $this->FILES = $FILES;

        if (!is_array($this->FILES['name'])) {
            return $this->uploadsOneFile();
        } else {
            return $this->uploadsManyFiles();
        }
    }

    /**
     * загрузка одного файла
     */
    function uploadsOneFile() {

        if ($this->FILES['error'] != 0) {
            $this->errors[] = $this->errorsMessage[$this->FILES['error']];
            return false;
        }

        $result = $this->upload($this->FILES['tmp_name'], $this->FILES['name']);
        if ($result != false) {
            $this->FILES['nameTranslit'] = $result;
            return true;
        }
        return false;
    }

    /**
     * загрузка нескольких файлов
     */
    function uploadsManyFiles() {
        $coutFiles = count($this->FILES['name']);
        for ($i = 0; $i < $coutFiles; $i++) {
            if ($this->FILES['error'][$i] == 0) {
                $result = $this->upload($this->FILES['tmp_name'][$i], $this->FILES['name'][$i]);

                if ($result != false) {
                    $this->FILES['nameTranslit'][$i] = $result;
                } else {
                    $this->errors[] = $this->FILES['name'];
                }
            } else {
                $this->errors[] = $this->errorsMessage[$this->FILES['error']];
            }
        }

        return true;
    }

    /**
     * проверяем, разрешен ли данный файл к загрузке
     */
    function typeChecking($fileName) {
        preg_match("#([\w()-_]+)\.([\w]{1,4})$#i", $fileName, $arrayNameFiles);
        $nameEnd = strtolower($arrayNameFiles[2]);
        if (in_array($nameEnd, $this->allowedType)) {
            return true;
        } else {
            $this->errors[] = "Файлы с расширением (<b>{$fileName}</b>) не разрешенны к загрузке.";
        }
        return false;
    }

    /**
     * ищет в каталоге файлы с таким же названием дописывает номер(равный количеству файлов с таким названием) в конец
     * @param $name
     */
    function substitute($name) {

        $files = scandir($this->dir);
        unset($files[0]);
        unset($files[1]);

        $i = 0;
        $newName = $name;

        preg_match("#([\w()-_]+)\.([\w]{1,4})#i", $name, $arrayNameFiles);
        $nameStart = $arrayNameFiles[1];
        $nameEnd = $arrayNameFiles[2];

        while (in_array($newName, $files)) {
            $newName = "{$nameStart}({$i}).{$nameEnd}";
            $i++;
        }
        return $newName;
    }

    /**
     * возвращаем информацию о файле
     */
    function getFilesInfo() {
        return $this->FILES;
    }

    /**
     * возвращаем ошибки
     */
    public function errors() {
        return $this->errors;
    }

    /**
     * переводим текст в транслит
     * @param $text
     */
    public static function translit($text) {
        $rus = array("а", "б", "в",
            "г", "ґ", "д", "е", "ё", "ж",
            "з", "и", "й", "к", "л", "м",
            "н", "о", "п", "р", "с", "т",
            "у", "ф", "х", "ц", "ч", "ш",
            "щ", "ы", "э", "ю", "я", "ь",
            "ъ", "і", "ї", "є", "А", "Б",
            "В", "Г", "ґ", "Д", "Е", "Ё",
            "Ж", "З", "И", "Й", "К", "Л",
            "М", "Н", "О", "П", "Р", "С",
            "Т", "У", "Ф", "Х", "Ц", "Ч",
            "Ш", "Щ", "Ы", "Э", "Ю", "Я",
            "Ь", "Ъ", "І", "Ї", "Є", " ");
        $lat = array("a", "b", "v",
            "g", "g", "d", "e", "e", "zh", "z", "i",
            "j", "k", "l", "m", "n", "o", "p", "r",
            "s", "t", "u", "f", "h", "c", "ch", "sh",
            "sh'", "y", "e", "yu", "ya", "_", "_", "i",
            "i", "e", "A", "B", "V", "G", "G", "D",
            "E", "E", "ZH", "Z", "I", "J", "K", "L",
            "M", "N", "O", "P", "R", "S", "T", "U",
            "F", "H", "C", "CH", "SH", "SH'", "Y", "E",
            "YU", "YA", "_", "_", "I", "I", "E", "_");
        $text = str_replace($rus, $lat, $text);
        return(preg_replace("#[^a-z0-9._-]#i", "", $text));
    }

}

HTML карта сайта на WordPress

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

В действительности, очень полезно использовать карту сайта HTML как часть темы. В таком случае карту сайта можно использовать и на странице WordPress для ошибки 404. Чтобы сделать карту сайта HTML частью темы надо создать папку partials в папке вашей темы. В папке partials создаем создаем файл с именем sitemap.php.

Копируем в него следующий код и правим его в соответствии со структурой своего сайта:
<h2 id="authors">Authors</h2>
<ul>
<?php 
wp_list_authors( 
  array(
    'exclude_admin' => false,
  )
); 
?>
</ul>
 
<h2 id="pages">Страницы</h2>
<ul>
<?php
// Страницы, которые надо исключить из карты сайта добавляем к exclude здесь
wp_list_pages( 
  array(
    'exclude' => '',
    'title_li' => '',
  )
);
?>
</ul>
 
<h2 id="posts">Заметки</h2>
<ul>
<?php
// Категории, которые надо исключить, добавляем к exclude здесь
$cats = get_categories('exclude=');
foreach ($cats as $cat) {
  echo "<li><h3>".$cat->cat_name."</h3>";
  echo "<ul>";
  query_posts('posts_per_page=-1&cat='.$cat->cat_ID);
  while(have_posts()) {
    the_post();
    $category = get_the_category();
    // Ссылку на заметку выводим только один раз, даже если она указана в нескольких категориях
    if ($category[0]->cat_ID == $cat->cat_ID) {
      echo '<li><a href="'.get_permalink().'">'.get_the_title().'</a></li>';
    }
  }
  echo "</ul>";
  echo "</li>";
}
?>
</ul>

Теперь там, где нужно вывести HTML карту сайта в теме WordPress вставляем следующий код:
<?php get_template_part('/partials/sitemap'); ?>



Чтобы сделать шаблон для карты сайта нужно скопировать файл page.php и переименовать копию в page-sitemap.php. Затем открываем его и ниже вызова функции the_content(); добавляем упомянутый ранее вызов get_template_part(). Теперь переходим в начало файла и после открывающего тега <?php (но перед вызовом get_header()), добавляем комментарий:
/*
Template Name: Карта сайта HTML
*/