Privoxy 3.0.3 Руководство Пользователя

Пред


 


14. Приложения

14.1. Регулярные выражения

Privoxy использует Perl-совместимые "регулярные выражения" в файлах действий и файлах фильтров, с помощью библиотек PCRE и PCRS.

Если вы читаете это, то вы, скорее всего, не знаете, что такое "регулярные выражения", или для чего они нужны. Здесь приводится только очень краткое введение в регулярные выражения. Полное описание потребует книги (здесь вы найдете такие книги) ;-)

Регулярные выражения предоставляют язык описания шаблонов, которые могут быть применены к строкам символов (буквы, числа и т.д.), чтобы определить, какие строки соответствуют шаблону, а какие – нет. Сами по себе шаблоны – это строки (иногда довольно сложные), состоящие из буквенно-цифровых символов, символов подстановки (wildcards) и других специальных символов, называемых метасимволами. «Метасимволы» имеют специальное значение и используются для построения сложных шаблонов. Perl-совместимые регулярные выражения – это особенно удобный «диалект» языка регулярных выражений.

Простейшая аналогия – использование символов подстановки при выводе списка файлов командой dir в DOS. Шаблону (wildcard) *.* соответствуют имена всех файлов. Здесь «специальный» символ – это звездочка, которой соответствует любое количество любых символов (в т.ч. 0, т.е. ни одного). Можно использовать более «избирательный» символ «?», которому соответствует один любой символ или ни одного. Поэтому команда "dir file?.text" выведет "file1.txt", "file2.txt" и т.д.. Похожая техника используется и в регулярных выражениях!

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

. - соответствует любому одиночному символу, например, "a", "A", "4", ":", или "@".

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

+ - предшествующий символ или выражение встречается один или более раз.

* - предшествующий символ или выражение встречается 0 или более раз.

\ - «экранирующий» (escape) символ означает, что следующий за ним символ следует считать обычным (т.е. не специальным). Необходимо, когда один из специальных символов (например ".") используется как обычный, а не метасимвол. Например: в шаблоне "example\.com" точка обозначает именно точку (а не метасимвол, означающий любой одиночный символ).

[] - строка будет соответствовать шаблону, если в ней встретится любой из символов, перечисленных в квадратных скобках. Например, шаблону "[0-9]" соответствует любая цифра (от 0 до 9). К примеру, можно использовать этот шаблон вместе с метасимволом "+": "[0-9]+", полученному шаблону будет соответствовать одна или более цифр.

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

| - символ вертикальной черты («bar») работает как условный оператор «или». Строка будет соответствовать всему шаблону, если она будет соответствовать одному из вложенных шаблонов слева или справа от символа «|». Например, шаблону "/(this|that) example/", в котором используется группировка и символ «|», будет соответствовать строка "this example", либо "that example" и никакая другая.

Это только небольшая часть того, что вы, вероятно, будете использовать для обработки URL в Privoxy. Но этого достаточно, чтобы начать с нескольких простых наглядных примеров:

/.*/banners/.* - простой пример использования обычного сочетания "." и "*" для обозначения любого символа, встречающегося 0 или более раз. Другими словами, любой строки. Весь шаблон начинается с прямого слэша, затем идет наше регулярное выражение (".*"), еще один прямой слэш, строка "banners", снова прямой слэш, и, наконец, еще ".*". Таким образом мы получили шаблон пути к каталогу. Этому шаблону соответствует любой файл, путь к которому содержит строку «banners». Шаблону ".*" соответствует любая последовательность символов, в которой в том числе могут быть еще прямые слэши, поэтому этому шаблону могут соответствовать и более длинные пути. Например, вот такой: "/eye/hate/spammers/banners/annoy_me_please.gif", или просто "/banners/annoying.html", или почти бесконечное количество других возможных комбинаций, в которых где-либо в пути к файлу есть строка «banners».

А теперь пример чуть посложнее:

/.*/adv((er)?ts?|ertis(ing|ements?))?/ - снова у нас есть несколько прямых слэшей ("/"), поэтому мы снова строим выражение, соответствующее пути к файлу. Снова есть шаблон ".*", который соответствует любому возможному пути (или его части). Только одна строка обязательно должна соответствовать нашему шаблону – это строка «adv» вместе со слэшами. А вот часть шаблона, идущая за «adv» поинтереснее.

Запомните, что символ "?", означает, что стоящее перед ним выражение (отдельный символ или любое их количество, объединенное скобками "(...)" ) может существовать, а может и не существовать, т.е. это означает 0 или 1 совпадение. Поэтому выражение "((er)?ts?|ertis(ing|ements?))" необязательное, также как и отдельные составляющие его выражения: "(er)", "(ing|ements?)", и "s". Символ "|" означает "или". У нас в данном случае таких символов два. Например, шаблону "(ing|ements?)" соответствует "ing" ИЛИ "ements?". Здесь делается попытка задать шаблон, которому будет соответствовать как можно больше вариантов слова «advertisement» и похожих на него слов. Таким образом этому шаблону будут соответствовать строки "adv", или "advert", или "adverts", или "advertising", или "advertisement", или "advertisements". В этом и состоит смысл нашего шаблона. Но под этот шаблон не подпадает строка "advertizements" (с "z"). Это можно обойти, изменив наше регулярное выражение следующим образом: "/.*/adv((er)?ts?|erti(s|z)(ing|ements?))?/", теперь оно учитывает даже произношение.

/.*/advert[0-9]+\.(gif|jpe?g) – и опять шаблон пути к файлу. Все, что находится в квадратных скобках "[]" может соответствовать шаблону. Запись "0-9" означает любую цифру от нуля до девяти. Это то же самое, что и запись "0123456789". Символ «+» означает, что стоящее перед ним выражение должно встречаться один или более раз. В данном случает перед «+» стоят квадратные скобки – все вместе это означает любую цифру от 0 до 9 (хотя бы одну). В конце у нас стоит выражение: "(gif|jpe?g)". Оно включает символ "|", что требует, чтобы с обоих сторон от него находились символы (или их группы). С одной стороны у нас идет просто "gif", а с другой – выражение, которому соответствуют как "jpeg", так и "jpg", поскольку символ «?» означает, что буква «e» перед ним необязательная и может встречаться один раз или ни разу. Итак, мы построили регулярное выражение, которому соответствуют файлы изображений GIF и JPEG. Путь к файлу должен включать строку "advert", затем одну или более цифр, и символ "." (который в данном случае является просто точкой, а не специальным символом, так как экранирован обратным слэшем "\"), и в конце "gif", или "jpeg", или "jpg". Вот несколько примеров строк, подпадающих под этот шаблон: "//advert1.jpg", "/nasty/ads/advert1234.gif", "/banners/from/hell/advert99.jpg". Но под действие этого шаблона не попадут строки "advert1.gif" (нет слэша в начале), "/adverts232.jpg" (наше выражение не включает символа "s"), или "/advert1.jsp" (строки "jsp" в выражении нет).

Здесь мы только слегка углубились в область регулярных выражений, чтобы вы могли понимать настройки по умолчанию Privoxy и, может быть, использовали полученные знания для своих собственных настроек. На самом деле с использованием регулярных выражений можно «творить чудеса»: то, что раньше казалось Вам сложным, заумным, невыполним, станет лёгким и доступным, когда Вы научитесь эффективно использовать регулярные выражения. Конечно, в рамках этого раздела мы не имели возможности достаточно полно осветить этот вопрос, но, тем не менее, теперь Вы знаете достаточно, чтобы начать учиться самостоятельно :/

Здесь содержатся исчерпывающая информация о Perl-совместимых регулярных выражениях: http://www.perldoc.com/perl5.6/pod/perlre.html

Сведения о регулярных выражениях, основанных на подстановках и их применении для фильтров смотрите здесь: руководство- «путеводитель» по файлу фильтров .

14.2. Встроенные страницы Privoxy

Обрабатывая каждую запрашиваемую web-страницу, Privoxy легко "отлавливает" некоторые специальные URL. Благодаря чему,  мы можем напрямую общаться с  Privoxy - видеть конфигурацию, видеть, как применяются наши правила, изменять эти правила и другие опции конфигурации, и даже выключить фильтрацию в Privoxy, и все это с помощью web-браузера.

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

Это может быть использовано для быстрых ссылок. Смотрите далее.

14.2.1. Закладки быстрого доступа

Ниже приводится несколько ссылок, предназначенных для закладок легкого доступа к мини-версиям специальных страниц Privoxy. Они разработаны для web-браузера MS Internet Explorer, но должны нормально работать с Netscape, Mozilla, и другими браузерами, котрые поддерживают JavaScript. Разработаны они для запуска из ваших закладок - не для того, чтобы "щелкать" мышкой по ссылкам ниже (хотя и это должно работать в качестве проверки).

Для сохранения этих ссылок щелкните правой клавишей мышки по ссылке и выберите "Добавить в избранное" в MS IE, или "Добавить в закладки" в Netscape. Вы можете получить предупреждение, что закладка может не сохраниться - просто, нажмите на ОК. Теперь вы можете запускать эти ссылки непосредственно из "Избранного/Закладок". Еще быстрее получится, если вы положите их на панель ссылок в IE или на "Персональную инструментальную панель" Netscape, теперь они будут запускаться одним "щелчком".

Благодарности: Сайт, который дал нам основные идеи для таких замечательных "закладок", это www.bookmarklets.com. Им есть, что сказать об этом. 

14.3. Цепочка событий

Бросим взгляд на основную последовательность событий, когда ваш браузер запрашивает web-страницу, а Privoxy "на посту":

14.4. Анатомия "действий"

Способ, которым Privoxy обращается к actions и filters для любого данного URL, может быть сложен, и далеко не всегда легко понять, что же происходит. Временами нам полезно было бы увидеть, а что именно Privoxy делает? Особенно, если что-то, что делает Privoxy, кажется нам возможным источником проблем. При первом взгляде можно слегка испугаться от вида файлов действий и фильтров, поскольку они имеют тенденцию наполняться regular expressions (регулярными выражениями), важность которых не всегда очевидна.

Один из быстрых тестов для определения, является ли источником проблемы Privoxy - временно отключить Privoxy. Это должно стать первым шагом при устранении проблем. Загляните в раздел the Bookmarklets (Закладки быстрого доступа), где найдете быстрый и легкий способ осуществить это (убедитесь, что кэш потом очищен). Взлянуть на записи в журнале (логи), тоже не плохая идея.

Privoxy поддерживает страницы http://config.privoxy.org/show-url-info, которые могут показать нам весьма детально, как действия применяются к любому данному URL. Это большая помощь в отыскании неполадок.

Первое, введите весь URL (или частичный URL) в командной строке, а затем Privoxy расскажет нам, как данная конфигурация поддерживает его. Это не поможет в отношении эффектов фильтрации (т.е. "+filter" действий) из файла default.filter, поскольку они поддерживаются весьма разнообразно, и не так легко отлавливаются! Privoxy также ничего не поведает относительно любых других URL, которые могут быть встроены внутри проверяемого URL. Например, рекламные картинки прописаны через URL внутри исходного кода HTML страниц. Так что вы получите информацию только об URL, введенном в командную строку, никак не о вложенных URL. Если вы хотите знать что-то о встроенных URL, как рекламные, вы должны откопать их в исходном тексте HTML. Используйте "Показать исходный код страницы" вашего браузера для этой цели. Или щелкните правой клавишей мышки по рекламе, чтобы захватить URL.

Давайте в качестве примера используем google.com, и посмотрим на одну из его секций в какой-то момент:

 Matches for http://google.com:
 In file: default.action [ View ] [ Edit ]
{-add-header 
 -block 
 -crunch-outgoing-cookies 
 -crunch-incoming-cookies 
 +deanimate-gifs{last} 
 -downgrade-http-version 
 +fast-redirects 
 -filter{popups} 
 -filter{fun} 
 -filter{shockwave-flash} 
 -filter{crude-parental} 
 +filter{html-annoyances} 
 +filter{js-annoyances} 
 +filter{content-cookies} 
 +filter{webbugs} 
 +filter{refresh-tags} 
 +filter{nimda} 
 +filter{banners-by-size} 
 +hide-forwarded-for-headers 
 +hide-from-header{block} 
 +hide-referer{forge} 
 -hide-user-agent 
 -handle-as-image 
 -kill-popups 
 -limit-connect 
 +prevent-compression 
 -send-vanilla-wafer 
 -send-wafer 
 +session-cookies-only 
 +set-image-blocker{pattern} }
/
 { -session-cookies-only }
 .google.com
 { -fast-redirects }
 .google.com
In file: user.action [ View ] [ Edit ]
(no matches in this file)  

Здесь рассказано, как мы определяли наши "actions", и какие из действий относятся к нашему примеру "google.com". В начале отображаются состветствия с файлом standard.action. В данном случае никаких совпадений со "standard". Затем следует "default", или наш файл  default.action. Большой, многострочный список того, как действия приведены в соответствие с URL, т.е. наши установки по умолчанию. Если вы взглянете на ваш файл "actions", это должен быть раздел сразу за "aliases", вверху. Это применяется ко всем URL, обозначенным одиночной косой чертой в конце списка - "/".

Но мы можем определить дополнительные действия, в виде исключений из этих главных правил, а затем список особых URL (или шаблонов), к  которым эти исключения тоже будут применяться. Последнее соответствие преобладает. Как раз ниже этого два точных указания на ".google.com". Первое устраняет наши предыдущие установки для cookie, относящиеся к  "+session-cookies-only" (т.е. не поддерживать). В итоге мы позволяем поддерживать cookie для google. Второе  выключает любые "+fast-redirects" действия, позволяя ненавязчивое присутствие. Отметьте предваряющую точку здесь - ".google.com". Это соотнесется с любыми хостами и поддоменами в домене google.com, такими как  "www.google.com". В результате, очевидно, мы имеем эти два действия определямыми где-нибудь в нижней части нашего файла  default.action, и на "google.com" есть ссылка где-нибудь в этих последних разделах.

И опять для нашего файла user.action мы не имеем привязок.

В заключение мы соберем все вместе в нижней секции и суммируем, как Privoxy применяет все эти действия к "google.com":

 Final results:
 
 -add-header 
 -block 
 -crunch-outgoing-cookies 
 -crunch-incoming-cookies 
 +deanimate-gifs{last} 
 -downgrade-http-version 
 -fast-redirects 
 -filter{popups} 
 -filter{fun} 
 -filter{shockwave-flash} 
 -filter{crude-parental} 
 +filter{html-annoyances} 
 +filter{js-annoyances} 
 +filter{content-cookies} 
 +filter{webbugs} 
 +filter{refresh-tags} 
 +filter{nimda} 
 +filter{banners-by-size} 
 +hide-forwarded-for-headers 
 +hide-from-header{block} 
 +hide-referer{forge} 
 -hide-user-agent 
 -handle-as-image 
 -kill-popups 
 -limit-connect 
 +prevent-compression 
 -send-vanilla-wafer 
 -send-wafer
 -session-cookies-only 
 +set-image-blocker{pattern} 


Отметьте здесь только разницу с предыдущим списком - в "fast-redirects" и "session-cookies-only".

Теперь другой пример - "ad.doubleclick.net":

 { +block +handle-as-image }
  .ad.doubleclick.net
 { +block +handle-as-image }
  ad*.
 { +block +handle-as-image }
  .doubleclick.net


Мы отобразили только то, что интересно - явные соответствия. Они появляются в трех разных случаях. Каждое, как "+block +handle-as-image", в расширенной форме одного из наших псевдонимов, который был определен, как: "+imageblock". ("Aliases" - псевдонимы, определены в первой секции файла действий и обычно используются для комбинации более, чем одного действия).

Любое из них способно на трюк по блокированию нежелательных картинок. Это несколько избыточно, поскольку в последнем случае эффективность достигается засчет первого соответствия. Однако и не стоит оставлять ни единого шанса этим парням ;-) Отметьте, если вы хотите, чтобы реклама или противный URL были невидимы, они должны быть определены, как это сделано для "ad.doubleclick.net" - и "+block" и  "+handle-as-image". Пользовательский псевдоним "+imageblock" только упрощает процесс, и делает его понятнее.

Еще один последний пример. Давайте попробуем "http://www.rhapsodyk.net/adsl/HOWTO/", демонстрирующий некоторые проблемы. Мы получаем  чистую страницу. Гммм ...

 Matches for http://www.rhapsodyk.net/adsl/HOWTO/:
 In file: default.action [ View ] [ Edit ]
 {-add-header 
  -block 
  -crunch-incoming-cookies 
  -crunch-outgoing-cookies 
  +deanimate-gifs 
  -downgrade-http-version 
  +fast-redirects 
  +filter{html-annoyances} 
  +filter{js-annoyances} 
  +filter{kill-popups} 
  +filter{webbugs} 
  +filter{nimda} 
  +filter{banners-by-size} 
  +filter{hal} 
  +filter{fun} 
  +hide-forwarded-for-headers 
  +hide-from-header{block} 
  +hide-referer{forge} 
  -hide-user-agent 
  -handle-as-image 
  +kill-popups 
  +prevent-compression 
  -send-vanilla-wafer 
  -send-wafer 
  +session-cookies-only 
  +set-image-blocker{blank} }
   /
 { +block +handle-as-image }
  /ads

Стоп, "/adsl/" соотносится с "/ads"! Но мы вовсе не хотели этого! Теперь понятно, почему мы получили чистую страницу. Нужно добавить новое действие ниже, чтобы исключение не блокировало ("{-block}") пути с "adsl". Есть разные способы сделать поддержку таких исключений. Например:

 { -block }
  /adsl


Теперь страница отображается ;-) Удостоверьтесь, что очистили кэш своего браузера, когда производите подобные изменения. Или попробуйте использовать Shift+Reload.

А теперь, что о ситуации, когда мы не получаем явного соответствия, как мы делали с:

 { +block +handle-as-image }
 /ads


Это действительно весьма поучительно и направляет нас прямо туда, где возникла проблема. Если вы не получаете такого рода соответствия, значит одно из правил по умолчанию в первой секции порождает проблему. Потребуется некоторая смекалка, и, возможно, ряд проб и ошибок для изоляции правила-нарушителя спокойствия. Одной из возможных причин может стать одно из действий "{+filter}". Они затруднят отладку. Попробуйте добавить URL сайта к одному из псевдонимов, которые выключают "+filter":

 {shop}
 .quietpc.com
 .worldpay.com   # for quietpc.com
 .jungle.com
 .scan.co.uk
 .forbes.com


"{shop}" это "alias" (псевдоним), рассширенный до "{ -filter -session-cookies-only }". Или вы должны создать ваше собственное исключение для подавления фильтрации:

 {-filter}
 .forbes.com


Исключение выключит фильтрацию для этого сайта. А самым подходящим, вероятно, местом, куда его следует положить, будет user.action, для исключений локального сайта.

Картинки, которые непонятно как будут блокироваться, могут хорошо отлавливаться правилом +filter{banners-by-size}", берущим на себя ответственность за то, что картинки некоторого формата - это рекламные баннеры (работает хорошо большую часть времени, с тех пор, как есть тенденция к стандартизации).

"{fragile}" - псевдоним, выключающий большую часть действий. Это может использоваться, как последняя надежда для проблемных сайтов. Не забудьте почистить кэш! Если все это еще не привело к успеху, вы должны будете перебрать все оставшиеся действия одно за другим, чтобы отыскать то (или те), которое является источником проблемы.


Пред

Домой

 

Смотрите также