#
# change the "use lib" directive in apache_rw.pl accordingly!
#
RewriteEngine on
#
RewriteMap news_map prg:/path/to/the/prog/apache_rw.pl
# log to test behaviour
# RewriteLog "/path/to/logs/website-rewrite.log"
# RewriteLogLevel 2
# If a QUERY_STRING is required, change the * to +
RewriteCond %{QUERY_STRING} ^(.*)$
# filter the query_string too
RewriteRule ^(/news.*)$ ${news_map:$1?%1} [L,R] [NE]
####
# creator : Tom Regner
# created : Mon 13 Jan 2003 01:47:26 PM CET
# version : $Id: apache_rw_cfg.pm,v 1.3 2003/03/07 17:33:35 tom Exp $
# copyright : (c) 2002, www.tomsdiner.org
#
# config for cms_nl_
# "use"d in the rewrite-map
#
#
package apache_rw_cfg;
require Exporter;
use vars qw($conf);
@ISA = qw(Exporter);
@EXPORT_OK = qw($conf);
use strict;
#
# allowed parameter configurations
#
my $nl_params = {
'p1' => {
name => 'param1', # substitute name
regexp => qr/^val1$|^val2$/, # passed value /must/ match this
},
'p2' => {
name => 'param1', # substitute name
regexp => qr/^[a-zA-Z0-9]{16}$/, # passed value /must/ match this
},
};
#
# redirect configuration
#
$conf = {
'/path1' => { # source
url => '/real/location/of/path1', # target-url
params => $nl_params, # allowed params
},
'/path1/t1' => {
url => '/real/location/of/somwhere/else,
params => $nl_params,
},
};
####
#!/usr/bin/perl -w
# creator : Tom Regner
# created : Mon 13 Jan 2003 01:29:04 PM CET
# version : $Id: apache_rw.pl,v 1.9 2003/06/12 11:10:38 tom Exp $
# copyright : (c) 2002, www.tomsdiner.org
use strict;
#
# AFAIK no URLs whith ';'-seperated parameters are possible with this
# program
#
# change this directive to point to the dir containing the config-file
use lib '/path/to/config/file';
use apache_rw_cfg qw($conf);
# necessary!!
$| = 1; # unbuffered IO
while (<>) {
my $line = $_;
if ($line =~ m{^(/[-/\w.]+?)\?([-=_&\w.]+?)(;[-\@:\w.]*)*$}) {
my ($uri, $params, $remainder) = ($1, $2,$3);
$remainder ||= '';
my ($new_uri, $new_params);
if ($conf->{$uri}->{'url'}) {
$new_uri = $conf->{$uri}->{'url'};
my $didIt = 1;
my @parm_list = split(/&/, $params);
$didIt = 0 if @parm_list == 0;
my @new_parm_list = ();
if ($didIt) {
foreach (@parm_list) {
my ($name,$value) = split('=', $_);
if (defined($conf->{$uri}->{params}->{$name})) {
if ($value =~ m{$conf->{$uri}->{params}->{$name}->{regexp}}) {
push(@new_parm_list, $conf->{$uri}->{params}->{$name}->{name} . '=' . $value);
} else {
$didIt = 0;
}
} else {
$didIt = 0;
}
}
}
if ($didIt == 1) {
$line = $new_uri . '?';
$remainder ||= '';
$line .= join('&', @new_parm_list) . $remainder . "\n";
} else {
$line = '/' . "\n";
}
} else {
$line = '/' . "\n";
}
}
print $line;
}