Yaxy -- это proxy-сервер для веб-разработчика, подменяющий запрашиваемые ресурсы, следуя простым правилам.
Если у вас до сих пор не установлен NodeJS, устанавливайте, после чего
npm install -g yaxy
yaxy --config my-yaxy-config.txt --port 9999
Если не указан параметр --config
, то ищется файл yaxy-config.txt в текущей директории. Если не указан --port
, то сервер будет слушать порт 8558
.
Конфигурационный файл читается построчно. Пустые строки, строки, начинающиеся на символ #
и строки неопознанного формата игнорируются.
Правила могут объединяться в секции. Начало секции задаётся строкой в квадратных скобках, содержимое строки может быть любым.
# Правила вне секций
[Секция 1]
# Правила секции 1
[Секция 2]
# Правила секции 2
Если имя секции начинается на #
, то все правила в секции игнорируются.
# Правила вне секций
[#Секция 1]
# Правила секции 1
# Будут игнорироваться
[Секция 2]
# Правила секции 2
Правила записываются в виде:
url => replacement
url
-- строка, на которую должен начинаться адрес, чтобы правило сработало. http://
в начале указывать необязательно. Например, правило www.yandex.ru => ...
будет срабатывать для всех ресурсов в домене www.yandex.ru, а правило yandex.ru/yandsearch => ...
-- только для поиска Яндекса.
Иногда требуется точное совпадение с адресом, например, необходимо модифицировать только главную страницу какого-нибудь сайта, а внутренние оставить без изменений. В таких случаях в начале урла нужно указать !
, http://
в начале указывать по прежнему необязательно, а вот завершающие слеши обязательны, т.к. совпадение должно быть точным. Например, подмена только главной страницы Яндекса: !www.yandex.ru/ => ...
.
Если не хватает первых двух вариантов, в левой части правила можно указать регулярное выражение, заключённое между символами /
. Вдруг вам понадобится модифицировать все запросы к доменам в зоне ru: /^http://[^/]+\.ru// => ...
. Обратите внимание, на вход регулярному выражению подаётся весь урл, включая http://
.
Если в левой части правила находится строка, то правая часть указывает, на что в урле заменить совпавшую левую. Например, правило google.ru => yandex.ru
заменит все запросы к google.ru
на запросы к yandex.ru
, т.е. запрос http://google.ru/
на самом деле уйдёт к http://yandex.ru/
, а запрос http://google.ru/foo/bar
уйдёт к http://yandex.ru/foo/bar
. Более точное правило google.ru/foo => yandex.ru/foo
заменит запрос к http://google.ru/foo/bar
, но оставит без изменений запрос http://google.ru/baz
. Обратите внимание, если необходимо сохранить путь внутри домена без изменений, то нужно указывать этот путь в обеих частях правила, т.к. google.ru/foo => yandex.ru
заменит http://google.ru/foo/bar
на http://yandex.ru/bar
.
Если в левой части правила находится регулярное выражение, то правая часть представляет собой шаблон, в который можно вставлять сохранённые группировки регекспа. Например, заменяем все запросы к доменам *.ru на *.com: /^(http://[^/]+\.)ru(/.*)$/ => $1com$2
.
Если в правой части правила указать протокол file://
, у нас получится маленький static-сервер.
# windows
host.com/some/path => file://c:/www/host.com
# linux
host.com/some/path => file:///home/www/host.com
index-файл для директорий -- index.html. Для приведённого примера по урлу http://host.com/some/path
прилетит файл /home/www/host.com/index.html
, по урлу http://host.com/some/path/empty.gif
прилетит файл /home/www/host.com/empty.gif
.
Если замена настолько простая, что даже файл создавать неохота, можно использовать data:uri.
host.com/some/path => data:text/html;<script type="text/javascript">alert('Привет!');</script>
В этом случае на все урлы, начинающиеся на host.com/some/path
будет ответ <script type="text/javascript">alert('Привет!');</script>
.
host.com/some/path/png => data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAD///+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4Ug9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC
На урлы, начинающиеся на host.com/some/path/png
отвечаем картинкой.
Если в левой части правила находится регулярное выражение, то сохранённые группировки можно вставлять в правую часть
/^http://test.my/\?name=(.*)/ => data:text/html;<script>alert('Привет, $1!');</script>
Если с урлом ничего делать не надо, то в правой части правила пишем $
.
host.com/some/path => $
Это бывает необходимо, если какой-нибудь запрос изменять не надо, но нужно применить к нему модификаторы, о которых ниже.
Если правую часть правила оставить пустой, то запрос просто оборвётся, не вернув даже http-заголовков.
Строки, начинающиеся на $
(не считая пробелов в начале строки) являются модификаторами. До первого пробела идёт название модификатора, после -- аргументы. Модификатор относится к тому правилу, после которого он записан. Если модификатор записан в начале файла, до всех правил, то он применяется ко всем правилам. Если модификатор записан в начале секции, то он применяется ко всем правилам в этой секции.
Обратите внимание, модификаторы в начале файла влияют именно на все правила, т.е. на запросы, попадающие под эти правила, а не на абсолютно все запросы, проходящие через прокси-сервер.
# Добавляем или изменяем параметр
$SetQueryParam from=yaxy
# Удаляем параметр
$RemoveQueryParam from
Cookie меняются для сервера, т.е. браузер посылает одни куки, а сервер получает другие.
# Добавляем или изменяем куку
$SetCookie user=YaxyUser
# Удаляем куку
$RemoveCookie ssid
# Устанавливаем заголовок запроса
$SetRequestHeader X-Requested-With: Yaxy
# Устанавливаем заголовок ответа
$SetResponseHeader X-Proxy: Yaxy
# Удаляем заголовок запроса
$RemoveRequestHeader Referer
# Удаляем заголовок ответа
$RemoveResponseHeader Content-Type
# Всегда отвечаем статусом 200, даже если что-то сломалось
$StatusCode 200
#Отвечаем не раньше, чем через 5 секунд
$Delay 5