Блокировка POST-запросов в .htaccess

С недавнего времени стали донимать боты-одиночки, которые непрерывно шлют POST-запросы на определённый URL, например:

111.111.111.111 - - [24/Mar/2013:11:28:01 +0300] "POST /edit HTTP/1.1" 404 13197 "http://example.com/" "Opera/9.80 (Windows NT 6.1) Presto/2.12.388 Version/12.14"

Лучше всего таких банить с помощью iptables, однако, если нет доступа к серверу, то с небольшим количеством ботов можно справиться и с помощью .htaccess:

RewriteCond %{REQUEST_URI} ^/edit$
RewriteCond %{REQUEST_METHOD} POST
RewriteRule ^ / [L,F]

В результате бот будет послан с ошибкой 403.
Здесь /edit — это страница сайта, к которой идут запросы.
Если боты ломятся на внутренние страницы, то мера будет такой:

RewriteCond %{REQUEST_METHOD} POST
RewriteRule .*/edit$ - [L,F]

Или универсальный метод, когда edit идёт и на главную, и на страницы:

RewriteCond %{REQUEST_METHOD} POST
RewriteRule ^(.*/)?edit$ - [L,F]

Расход процессами занимаемой памяти с сортировкой

Полезная однострочная команда, показывающая занимаемое процессами место в оперативной памяти. Суммирует все процессы с одинаковым именем, и сортирует по убыванию. Выводит объём в мегабайтах и имя процесса.

ps -eo comm,rss|awk '{arr[$1]+=$2} END {for (i in arr) {print arr[i]/1024, i}}'|grep -v '^0 '|sort -n -r

Установка устаревшего ядра CentOS

В официальных зеркалах CentOS расположены пакеты только для последних версий, устаревшие удаляются.
Однако, их можно найти здесь.
Чтобы установить старое ядро, например 2.6.32-220 от версии CentOS 6.2, выполняем команду:

rpm -ivh --oldpackage http://vault.centos.org/6.2/os/x86_64/Packages/kernel-2.6.32-220.el6.x86_64.rpm

Удалить ещё проще:

rpm -e kernel-2.6.32-220.el6.x86_64

Удалить файлы, за исключением некоторых

Удаляем все файлы в текущей директории, кроме некоторых, перечисленных в аргументах.
Простейшая конструкция — спасаем от удаления один файл fileX:

find . -type f -not -name "fileX" -print0 | xargs -0 rm

Из расстрельного списка можно исключить сразу несколько файлов:

find . -type f -not -name "file1" -not -name "file2" -print0 | xargs -0 rm

Редирект 301 в nginx

Простая переадресация в nginx с кодом 301 (перемещено постоянно) с домена с www на домен без www:

server {
  listen 80;
  server_name www.example.com;
  return 301 http://example.com$request_uri;
}

Соответственно, редирект с домена без www на www делается аналогично.

Жёсткие диски WD Green и странный щёлкающий звук

Возникла необходимость приобрести жёсткий диск большой ёмкости для хранения резервных копий. Особо не заморачиваясь с выбором, купил новенький жёсткий диск WD20EARX на 2ТБ. Этот диск относится к серии Green, имеет частоту вращения шпинделя 5400 об/мин, и потребляет немного электроэнергии. То, что нужно для случаев, когда не требуется высокая производительность, а упор делается на низкие уровни энергопотребления, нагрева и шума.
Во время тестирования обратил внимание, что диск периодически издаёт негромкий, но отчётливый «кликающий» звук. Стало интересно, что это, и не является ли это заводским браком. Чуть-чуть погуглив, выяснилось, что браком это не является, и этот звук — звук парковки головок. Причиной оказалась фирменная технология WD Intellipark, которая паркует головки после определённого времени бездействия и отключает часть электронных схем для экономии электроэнергии. По умолчанию время бездействия выставлено в 8 секунд.
В S.M.A.R.T. жёсткого диска есть параметр, который показывает количество парковок головок. Это параметр Load_Cycle_Count, под номером 193. У меня значение этого параметра за несколько часов использования превысило 200:

193 Load_Cycle_Count        0x0032   200   200   000    Old_age   Always       -       232

Выяснилось, что технология Intellipark в сочетании с технологией отложенной записи в Linux и вызывает постоянную парковку головок.
Я не тестировал диск под Windows, но однозначно ясно, что если вы используете диск WD Green на компьютере, в домашнем медиа-сервере или NAS, работающих под управлением Linux, то с этим однозначно что-то надо делать, т.к. постоянная парковка головок не только сказывается на производительности жёсткого диска, но и может существенно снизить продолжительность его службы и привести к преждевременной поломке.
К счастью, выход из этой ситуации есть.
На официальном сайте WD есть утилита, которая может изменить время бездействия до парковки головок, или полностью отключить эту функцию. Утилита называется wdidle3, и её можно скачать здесь.
Утилита работает из-под DOS и имеет следующие параметры (взяты из официального описания):

WDIDLE3 [/S[<Timer>]] [/D] [/R] [/?]
where:
/S[<Timer>] Set timer, units in seconds. Default=8.0 (8.0 seconds).
            Resolution is 0.1 seconds from 8.0 to 12.7 seconds.
            Resolution is 30 seconds from 30 seconds to 300 seconds.
            Note, times between 12.8 and 30 seconds will be set to 30 seconds.
/D          Disable timer.
/R          Report current timer.
/?          This help info.

Для того, чтобы её запустить, нужно записать утилиту на загрузочный флоппи-диск, компакт-диск или сетевой диск, загрузить с него DOS и запустить например так:

wdidle3.exe /S 180

Это установит таймер бездействия на 3 минуты.

Это конечно всё хорошо, но мне было очень лениво вспоминать, как загружаться в DOS, я уже и не припомню, когда последний раз делал это. Поэтому нашёл альтернативный метод — аналогичную утилиту с открытым кодом idle3-tools, разработанную для Linux. Даже если вы используете Windows, то возможно вам также будет проще загрузиться в какой-нибудь Linux Live CD, и запустить там утилиту.
Для запуска утилиты потребуется её скомпилировать из исходников, поэтому в системе должен быть установлен компилятор gcc и утилита сборки make.
Итак, качаем:

wget http://downloads.sourceforge.net/project/idle3-tools/idle3-tools-0.9.1.tgz?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Fidle3-tools%2Ffiles%2F

Распаковываем:

tar xzvf idle3-tools-0.9.1.tgz

Компилируем:

cd idle3-tools-0.9.1.tgz
make
make install
make clean

Запускаем

idle3ctl

Утилита выведет список доступных опций запуска:

idle3ctl v0.9.1 - Read, Set or disable the idle3 timer of Western Digital drives
Copyright (C) 2011  Christophe Bothamy

Usage: idle3ctl [options] device
Options:
-h : displat help
-V : show version and exit immediately
-v : verbose output
--force : force even if no Western Digital HDD are detected
-g : get raw idle3 timer value
-g100 : get idle3 timer value as wdidle3 v1.00 value
-g103 : get idle3 timer value as wdidle3 v1.03 value
-g105 : get idle3 timer value as wdidle3 v1.05 value
-d : disable idle3 timer
-s<value> : set idle3 timer raw value

Выясните имя устройства для вашего диска, например так:

fdisk -l

В моём случае это /dev/sdb.
Если требуется установить таймер, например, на 5 минут, то утилиту запускаем так:

idle3ctl -s 300 /dev/sdb

Я вообще не стал заморачиваться с таймером, и полностью отключил фичу парковки головок:

idle3ctl -d /dev/sdb

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

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

--force : force even if no Western Digital HDD are detected

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

Решаем проблему с кодировкой страниц сайта

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

wget http://example.com -S -O /dev/null

Вот пример ответа веб-сервера:

  HTTP/1.1 200 OK
  Server: web-server
  Date: Tue, 20 Dec 2011 18:50:15 GMT
  Content-Type: text/html; charset=utf-8
  Connection: close
  Cache-Control: max-age=300
  Expires: Tue, 20 Dec 2011 18:55:17 GMT

Обратите внимание на слово charset. Оно-то и сообщает браузеру, что на данном сервере используется по умолчанию кодировка utf-8.
Если такого слова в ответе нет, заставить веб-сервер сообщать кодировку можно директивой в файле .htaccess, добавив в него строку:

AddDefaultCharset utf-8

В данном случае веб-сервер станет сообщать о кодировке utf-8. Другая весьма распространённая у нас кодировка — cp1251.

Второй способ сообщить браузеру о кодировке страницы — прописать информацию в мета-теге. Откройте исходник вашей страницы и посмотрите информацию между тегов <head>. Если информация о кодировке корректно записана в мета-теге, то вы должны будете увидеть строку вроде такой:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

Убрать лишний index.php из .htaccess

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

Суть проблемы:
Есть сайт на Joomla, включены ЧПУ, на новом хостинге всё функционирует отлично. Ссылки на сайте выглядят как http://site.by/section/category/
Но, будучи на старом хостинге, все страницы сайта чудесным образом проиндексировались поисковыми системами как http://site.by/index.php/section/category/
В результате, если заходить на сайт напрямую, то сайт красиво работает на новом хостинге. Однако, люди, заходящие из поисковиков, видят криво работающий сайт (не подгружаются css, вся графика и javascript). Не знаю, что было не так со старым хостингом, во время которого проходила индексация, но правила реврайтов для SEF .htaccess были стандартные для движка joomla:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/index.php
RewriteCond %{REQUEST_URI} (/|\.php|\.html|\.htm|\.feed|\.pdf|\.raw|/[^.]*)$  [NC]
RewriteRule (.*) /index.php
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]

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

RewriteCond %{THE_REQUEST} ^GET.*index\.php [NC]
RewriteRule (.*?)index\.php/*(.*) /$1$2 [R=301,L]

Эти 2 строки, помещённые перед секцией SEF в .htaccess, удаляют index.php из URL и делают постоянный редирект на URL, и приводит к стандартному виду ЧПУ Joomla.

Whois в зоне .by

С 25 февраля наконец-то был запущен сервис whois для доменов в зоне .by.
К сожалению, использование captcha на этом сайте сводит на нет всё удобство пользования этим сервисом.
Но, к счастью, есть способ лучше — использовать командную строку Linux:

# whois -h whois.cctld.by networker.by
[Querying whois.cctld.by]
[whois.cctld.by]
Domain Name: networker.by
Registrant: HIDDEN! Details are available at http://www.cctld.by/whois
Registrar: Extmedia, Ltd
Name Server: ns1.login-by.net
Name Server: ns1.login-by.com
Name Server: ns2.login-by.net
Name Server: ns2.login-by.com
Status: ok
Updated Date: 2011-11-25T08:40:06.0Z
Creation Date: 2010-12-10T09:50:14.0Z
Expiration Date: 2012-12-13T10:01:16.0Z

-------------------------------------------
Service provided by Reliable Software, Inc.

Пока приходится использовать команду whois с ключом -h и с указанием белорусского сервера whois, но рано или поздно он будет включён в репозитории, и после очередного обновления системы команда будет работать без ключа, как для всех остальных доменов.

Поиск сайтов на одном IP

Известны различные веб-сервисы, которые показывают количество сайтов на одном IP сервера, некоторые даже показывают их список.
Но в большинстве случаев эти сервисы сильно отстают от поисковиков, и показывают количество сайтов, намного меньшее, чем есть на самом деле на сервере (цифра может быть в 2-3 раза ниже реальной).
Вот тут и пригодится поисковик bing.com, которым вы наверняка не пользуетесь 😉
Пишем в нём

ip:aa.bb.cc.dd

где aa.bb.cc.dd — IP-адрес нужного нам сервера, и в выдаче получаем список сайтов с этого сервера.