Pull to refresh
93
0
Олег Петрачёв @cronfy

User

Send message

Как на самом деле работает mod_rewrite. Пособие для продолжающих

Reading time17 min
Views277K
image
Эта статья выросла из идеи продвинутого обучения наших сотрудников технической поддержки работе с mod_rewrite. Практика показала, что после изучения имеющихся в большом количестве учебников на русском языке саппортам хорошо дается решение шаблонных задач, но вот самостоятельное составление правил происходит методом проб и большого количества ошибок. Проблема заключается в том, что для хорошего понимания работы mod_rewrite требуется изучение оригинальной англоязычной документации, после чего — либо дополнительные разъяснения, либо часы экспериментов с RewriteLog.

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

Я предполагаю, что читатель уже знаком с тем, что такое mod_rewrite, и не буду описывать его основы, которые легко найти в интернете. Также нужно отметить, что в статье освещается работа mod_rewrite при использовании его директив в файле .htaccess. Отличия при работе в контексте <VirtualHost> изложены в конце статьи.

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

Почему так происходит?
Читать дальше →
Total votes 208: ↑203 and ↓5+198
Comments25

Через какую дыру взломали сайт?

Reading time6 min
Views142K
imageЕсли сайт взломан, мало удалить с него вирус и загруженный PHP Shell. Нужно еще найти причину, по которой произошел взлом, иначе через день-два на сайте снова будет под бодрую музыку развеваться красивый турецкий иностранный флаг. Чаще всего причина — украденный пароль от FTP, устаревшая версия CMS или плагина к ней, но как найти, что именно было использовано для проникновения?

Имея некоторый опыт в этой сфере (в среднем наша техподдержка занимается поиском причины взлома сайта раз в неделю), мы систематизировали накопившуюся информацию.

Итак, зачем вообще взламывают сайты? И что делать, если сайт взломан, как найти причину и защититься от последующих атак?
Читать дальше →
Total votes 67: ↑56 and ↓11+45
Comments42

Дэн Пинк об удивительной науке мотивации

Reading time1 min
Views1.9K
Daniel Pink — автор книг и статей о современном подходе к бизнесу. Об одной из его книг как-то уже писали на хабре.

В этом коротком выступлении Daniel рассказывает о том, что «метод пряника» работает только для мотивации рутинного труда. А для сфер деятельности, требующих творческого подхода, не только не приносит пользы, но и делает работу менее эффективной. Он предлагает новые методы мотивации, которые сделали возможным появление таких продуктов как Wikipedia и Google Mail. И применение этих методов в будущем, возможно, сможет сделать мир немного лучше.

Вот версия выступления с русскими субтитрами.

А вот оригинал:

Total votes 52: ↑46 and ↓6+40
Comments30

repquota грузит сервер — как лечить

Reading time1 min
Views713
Хочу поделиться решением проблемы с repquota, с которой столкнулся сегодня. Надеюсь, поможет кому-нибудь не тратить время на разбирательства.

Стоит FreeBSD 6.2. Регулярно с помощью repquota собирается статистика по использованию пространства пользователями.

Симптомы проблемы: при запуске repquota или quotacheck процесс начинает грузить CPU, а главное — валит диски по дисковым операциям. Сервер практически ложится.

Симптомы снимаются убиванием процесса repquota или quotacheck.

А оказалось, что файл /home/quota.user достиг невообразимых размеров: 64G. Заметил случайно — по логам бэкапов.

Проблема полностью вылечилась банально следующим:

rm /home/quota.user
rm /home/quota.group
quotaoff /usr/home
quotacheck /usr/home
quotaon /usr/home


UPD

Корень зла



Суть оказалась в формате файла quota.user. Информация о квоте хранится в файле по смещению uid * 32. Соответственно, при большом uid (или при отрицательном) файл оказывается слишком большим, и repquota тратит много времени на просмотр файла, чтобы добраться до последнего uid.

Подробнее на opennet и в рассылке freebsd.

Пользователя с огромным uid не нашлось, зато нашёлся файл с uid 2147483647. Его создавал exim, из-за того, что в системе был пользователь с логином, состоящим из 11 цифр. При назначении прав на почту пользователя exim начинал думать, что это uid, а не имя.

В общем, как-то так.
Total votes 2: ↑1 and ↓10
Comments3

Flash-банеры: изменение ссылки банера через параметры <object> в коде страницы

Reading time1 min
Views419
Ситуация: есть нарисованный веб-студией банер для рекламы сайта. Нужно иметь возможность менять ссылку, на которую происходит переход с банера.

Flash позволяет передавать параметры во внедряемый на страницу объект. Но практика показывает, что не во всякой веб-студии есть flash-дизайнер, который знает ActionSript. Поэтому на просьбу сделать ссылку изменяемой приходит ответ: «Присылайте ссылку — поменяем». А хочется-то самим.

Поэтому специально для одной веб-студии была написана подробная инструкция о том, как сделать flash-банер, ссылку в котором можно менять извне.
Total votes 9: ↑7 and ↓2+5
Comments7

Замена хотсвопом диска в зеркале gmirror под FreeBSD

Reading time2 min
Views3K
Ситуация: есть RAID-массив из двух SATA-дисков в зеркале, созданном с помощью gmirror под FreeBSD.

Необходимо заменить один диск, не останавливая работы сервера.

Капля теории


На тему собственно создания зеркала на GEOM есть много статей.

При создании зеркала gmirror синхронизирует все данные, включая MBR, гласит http://people.freebsd.org/~rse/mirror/ (раздел Summary -> GEOM mirror on whole disk). Если при отказе диска сервер умер, можно загрузиться с оставшегося диска, вне зависимости от того, какой диск вышел из строя. Важно только при загрузке правильно выбрать, с какого диска грузиться.

При работе массива команда

# gmirror list

практически постоянно показывает Flags: DIRTY. Это нормально: флаг выставляется, когда на диск записывается информация, и в этот момент состояние данных на дисках массива не совпадает. Если на диск постоянно ведётся запись, флаг DIRTY постоянно будет выставлен.

Процедура замены


Предположим, в массиве gm0 присутствуют два диска: da0 и da1. Заменить нужно da0.

В описываемой ситуации использовался camcontrol. В зависимости от контроллера, через который подключены винты, вместо него может понадобиться atacontrol.
  1. Выводим диск из зеркала:

    # gmirror remove gm0 da0
    

  2. Определяем, какой диск физически нужно заменить — у выведенного из зеркала диска не будет работать индикатор активности.
  3. Не выключая сервер, вытаскиваем диск.
  4. Здесь возможно следующее: сервер несколько секунд ничего не понимает, а потом на полминуты впадает в кому. Нужно немного подождать.
  5. После этого команды

    # geom disk list
    # gmirror list

    помогут обнаружить, что одного диска нет.
  6. Если не был выполнен пункт №1, просим gmirror забыть обо всех дисках, которые сейчас неактивны в зеркале:

    # gmirror forget gm0

    gmirror обнаруживает, что da0 нет и забывает про него.
  7. Вставляем новый диск (желательно идентичный тому, с которым в паре он будет работать, вплоть до модели).
  8. Сканируем шину, чтобы система обнаружила новый подключённый диск:

    # camcontrol devlist           # что имеем сейчас?
    # camcontrol rescan all        # сканируем
    # camcontrol devlist           # что получилось?
    

  9. Добавляем в массив новый da0:

    # gmirror insert gm0 da0

  10. gmirror обнаружит новый диск и начнёт синхронизацию данных. Смотрим состав массива:

    # gmirror list

  11. Не пугаемся, если нам кажется, что синхронизация идёт не в том направлении :) Если заменялся da0, то теперь он в списке ПОСЛЕ da1, а не ДО, как был раньше.
  12. Испытываем счастье.
Total votes 6: ↑6 and ↓0+6
Comments22

Information

Rating
Does not participate
Location
Санкт-Петербург и область, Россия
Date of birth
Registered
Activity