Mod_perl handler
Главная → Perl → Mod_perl handler
Тема сегодняшней статьи mod_perl handler. Для начинающих сделаю лирическое отступление. Mod_perl handler — встроенный обработчик, способный апеллировать с данными еще до того как apache начнет выполнять основной набор серверных скриптов. Может быть полезен для многих вещей, например устанавливать cookies, делать upload и т. д. Оболочкой для handler-а служит простой perl — модуль. Мне например довелось его применить для массового rewrite урлов или если выразиться согласно документации URI Rewrite in PerlTransHandler. Можно было бы пойти сложным путем и тупо прописать все rewrite в конфе фронтэнда. Но я решил не испытывать судьбу, облегчить труд и брать все из базы. В этом и есть основное преимущество mod_perl handler.
А проблема собственно была в том, что на некотором проекте произошел рефакторинг кода и изменились урлы, некоторые из которых продвигались. В наличии имелась сводная таблица со старыми и новыми урлами. Задача звучала незамысловато: встретить старый url, найти соответствие в базе и отдать искомый контент расположенный фактически по новому адресу.
Оболочка для mod_perl handler
Ниже описанный пример выполнен для наглядности в лоб, но если нужно делаете use DBI и будет вам счастье.
#!/usr/bin/perl -w package Modules::Rewrite; use strict; use Exporter; use Apache2::RequestRec(); use Apache2::Const -compile => qw(:common); our $VERSION = '1.0'; sub handler { my $r = shift; my $page = $r->uri; my %args = $r->args; if ($page =~ m!/directory/index.php!) { $r->uri("/catalog/index.html"); $r->args("category=1"); } return Apache2::Const::DECLINED } 1;
В итоге, если будет запрошен url /directory/index.php, то handler отдаст документ /catalog/index.html?category=1. Так же можно отслеживать и входящие параметры запроса, которые выбирает метод args.
my %args = $r->args;
Включение handler
Чтобы включить handler в работу нужно в конфигурационном файле apache, чуть ниже включения режима mod_perl, добавить следующие директивы:
PerlModule Modules::Rewrite PerlTransHandler Modules::Rewrite
Все, наш mod_perl handler готов принимать заказы на рерайты важных урлов.