www.Litecode.ru – Сборник рецептов для создания сайтов

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 готов принимать заказы на рерайты важных урлов.