#!/usr/bin/perl

# use strict; # alleen tijdens syntax check

my $logFile = '/var/www/redirect/log/redirect.log'; # geen .log want die wordt anders geroteerd

sub now() {
	my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
	return sprintf("%04d%02d%02d-%02d%02d%02d", $year+1900,$mon+1,$mday,$hour,$min,$sec);
}



my $proto = 'https';
my $host = '';
my $uri = '';
my $newhost = 'www.gps.nl';
my $newpath = '/';
my $status = 301;
my $origproto = 'https'; $origproto = 'http' if $ENV{'SERVER_PORT'} == 1080;

print "Content-type: text/html\n";
#print "X-Backend: redirect\n";
#print "Content-type: text/plain\n\n";
#
#foreach $i (keys %ENV) {
#	print "$i\t$ENV{$i}\n";
#}

if (defined($ENV{'HTTP_HOST'})) {
	$host = $ENV{'HTTP_HOST'};
	$host =~ tr/A-Z/a-z/;
}
else {
	$host = 'x';
}
if (defined($ENV{'REQUEST_URI'})) {
	$uri  = $ENV{'REQUEST_URI'};
	$uri =~ s/&sid=[a-z0-9]*//;
}
else {
	$uri  = 'x';
}

my $referer = (defined($ENV{'HTTP_REFERER'}) ? $ENV{'HTTP_REFERER'}:'x');

my $logOpen = 0;
my $user_agent;
if (defined($ENV{'HTTP_USER_AGENT'})) {
	$user_agent = $ENV{'HTTP_USER_AGENT'};
}
else {
	$user_agent = 'X';
}
unless ($uri =~ /generate_204$/) {
    if ($uri =~ /(nonexist|w00tw00t|(ad)?xmlrpc\.php|bin\/msgimport)/ or
	$uri =~ /\/wp-admin/ or
	$user_agent =~ /^Java\/1\.[46][-_.0-9]*$/ or
	$user_agent =~ m,http://www\.forumseek\.net/, or
	$user_agent =~ /Bittorrent/ or
	$user_agent =~ /Microsoft-CryptoAPI/ or
	$host =~ /\.flickr\b/ or
	$host =~ /\.twitter\.com\b/ or
	$host =~ /\.avast\.com/ or
	$host =~ /cdn/ or
	$host =~ /avatar/ or
	$host =~ /^194\.109\.216\.24[46]$/ or
	$host =~ /webmail/ or
	$referer =~ /(\.ru|--p1ai)$/
    ) {
	if ($user_agent !~ /Googlebot/) {
	    if (open(LOGFD, ">>$logFile")) {
		$logOpen = 1;
		print LOGFD now() . ' ' . $ENV{'REMOTE_ADDR'} . ": $referer -> $user_agent: host = $host, URI = $uri BLOCKED\n";
	    }
	    if (defined($ENV{'REMOTE_ADDR'}) and open(PIPE, '>>/var/run/ipt_recent')) {
		print PIPE "www $ENV{'REMOTE_ADDR'}\n";
	    }
	}
	print "Status: 404\r\n\r\n";
	print '<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">' . "\n" .
	      '<html><head><title>404 Not Found</title></head><body><h1>Not Found</h1><p>The requested URL was not found on this server.</p></body></html>' . "\n";

	exit;
    }
}

$newpath = $uri if $uri eq '/robots.txt';

if ($uri =~ m,/\./.,) { # fixup domme clients die src="./bla" niet optimaliseren
	while ($uri =~ m,/\./.,) {
		$uri =~ s,/\./,/,;
	}
}

if ($uri =~ /favicon\.(ico|gif)/ and $referer eq 'x') {
	$status = 404;
}
elsif ($uri =~ m,^/.+\.html/,) {
	$status = 410; # gone away
}
elsif ($uri =~ m,^/index\.html.*\.[a-z][a-z][a-z]\b,) {
	$status = 404;
}
elsif ($host eq 'gps.nl') {
	$newhost = 'www.gps.nl';
	$newpath = $uri;
	if ($host eq 'gps.nl' and $uri eq '/cursus') {
		$newpath = '/cursus/';
	}
}
elsif ($host =~ /\bjouw(garmin|gps)\.nl$/) {
	$newhost = 'www.gps.nl';
}
elsif ($host =~ /^(www\.)?(gps-?garmin|garmin-gps(-shop|-winkel)?)\.nl$/) {
	$newhost = 'www.gps.nl';
	$newpath = $uri;
}
elsif ($host =~ /\bgps-specialist\.nl$/) {
	$newhost = 'www.gps.nl';
	$uri = '/over_waypoint.html' if $newpath eq '/';
}
elsif ($host =~ /\bway-point\.nl$/) {
	$newhost = 'www.way-point.nl';
}
elsif ($host =~ /(www\.)?sena-outdoor\.nl/) {
	$newhost = 'www.sena-outdoor.nl';
	$newpath = $uri;
}
# elsif ($host =~ /dealer\.tech-?trade\.(nl|com)/ or $host =~ /dealer\.teqtrade\.com/) {
# 	$newhost = 'dealer.teqtrade.nl';
# 	$newpath = $uri;
# }
# elsif ($host =~ /admin\.tech-?trade\.nl|com/ or $host =~ /admin\.teqtrade\.com/) {
# 	$newhost = 'admin.teqtrade.nl';
# 	$newpath = $uri;
# }
elsif ($host =~ /sena\.te(ch-?|q)trade\.(nl|com)/) {
	$newhost = 'www.teqtrade.nl';
	$newpath = '/sena.html';
}
elsif ($host =~ /(www\.)?te(ch|q)trade\.nl/) {
	$newhost = 'www.teqtrade.nl';
	$newpath = $uri;
}
elsif ($host =~ /(.*\.)techtrade\.(nl|com)/) {
	$newhost = $1 . 'teqtrade.nl';
	$newpath = $uri;
}
elsif ($host =~ /^mailinglist\.(gps|teqtrade|wolfcamper)\.nl$/) {
	$newhost = $host; # maar dan https
	$newpath = $uri;
}
elsif ($host =~ /wolf-?camper\.(nl|be)/) { # geen wolf-camper.be
	$newhost = 'nl.wolfcamper.com';
}
elsif ($host =~ /wolfcamper\.de/) {
	$newhost = 'de.wolfcamper.com';
}
elsif ($host =~ /to[eu]r\.gps\.nl/) {
	$newhost = 'hans.gps.nl';
	$newpath = '/tour/' if $newpath eq '/';
}
elsif ($host =~ /etrex\.nl/) {
	$newhost = 'www.gps.nl';
	$newpath = '/wandelnavigatie/garmin_etrex_serie.html' if $newpath eq '/';
}
elsif ($host =~ /streetpilot\.nl/) {
	$newpath = '/autonavigatie/' if $newpath eq '/';
}
elsif ($host =~ /perfectpilot\.nl/) {
	# $newpath = '/perfect_pilot.html' if $newpath eq '/';
	$newpath = '/motornavigatie/' if $newpath eq '/';
}
#elsif ($host =~ /ram-mount\.nl/) {	# heeft nu geen A records
#	$newhost = 'www.gps.nl';
#	$newpath = '/motormontage/ram_mount.html' if $newpath eq '/';
#}
elsif ($host =~ /(gps|ram)-mount\.(eu|nl)/) {
	$newhost = 'snelbalie.gps.nl';
	$newpath = '/zoeken?zoekterm=ram-mount' if $newpath eq '/';
}
elsif ($host =~ /test\.teqmount\.(nl|eu)/) {
	$newhost = 'test.teqmount.eu';
}
elsif ($host =~ /teqmount\.(nl|eu)/) {
	$newpath = '/motormontage/' if $newpath eq '/';
}
elsif ($host =~ /forum/) {
	$newhost = 'forum.gps.nl';
}
elsif ($host =~ /\bonroute\.(nl|be)$/) {
	$newhost = 'www.onroute.nl';
	$newpath = $uri;
}
elsif ($host =~ /gpsfietskaart\.nl/ or $host =~ /(digifietser\.|gazelle|nieuwfietsen|hetnieuwefietsen)/ or $uri =~ /gazelle/) {
	$newhost = 'www.onroute.nl';
	$newpath = '/index.php/onroute-fietskaart' if $newpath eq '/';
}
elsif ($host =~ /bestellen\.onroute\.(nl|be)/) {
	$newhost = "snelbalie.gps.nl";
	$newpath = '/producten:GPS+software+%40+kaarten:Kaartmateriaal+-+OnRoute' if $newpath eq '/';
}
elsif ($host =~ /nieuws\.onroute\.(nl|be)/) {
	$newhost = "www.onroute.$1";
	$newpath = '/index.php/alle-nieuws' if $newpath eq '/';
}
elsif ($host =~ /helpdesk\.onroute\.(nl|be)/) {
	$newhost = "www.mywaypoint.nl";
}
# elsif ($host =~ /^((auto|helpdesk|kck|kampioen|promotor|upgrade)\.)?onroute\.(nl|be)/) { # }
elsif ($host =~ /\.onroute\.(nl|be)$/) {
	$newhost = "www.onroute.$1";
}
elsif ($host =~ /(gps-discounter\.be|gps4all\.(be|nl))/) {
	$newhost = 'navi.nl';
}
elsif ($host =~ /toecompst\.(nl|com)/) {
	$newpath = '/motornavigatie/' if $uri eq '/motorhome/';
}
elsif ($host eq 'tomtom.gps.nl') {
	$newpath = "/tomtom1.html" if $newpath eq '/';
}
elsif ($host =~ /nuvi\.nl/) {
	$newpath = "/autonavigatie/garmin_nuvi.html" if $newpath eq '/';
}
elsif ($host =~ /verhuur\.gps\.nl\z/) {
	$newhost = "www.gps.nl";
	$newpath = "/verhuur$uri";
}
elsif ($host =~ /(hands|occ?ass?ions?|marktplaats)/) {
	$newhost = "www.gps.nl";
	$newpath = "/occasions";
}
elsif ($host =~ /snelbalie/) {
	$newpath = $uri;
	$newhost = "snelbalie.gps.nl";
}
elsif ($host =~ /vacatures?\.gps\.nl/) {
	$newpath = "/vacatures.html" if $newpath eq '/';
}
elsif ($host =~ /^((www\.)?mywaypoint\.nl|(www\.)?mywaypoint\.eu|(www\.)?mijngps\.nl|(www\.)?mijngarmin\.nl)\.?$/) {
	$newhost = "www.mywaypoint.nl";
	$newpath = $uri;
}
elsif ($host =~ /help(desk|-?gps)\./ or $uri =~ /helpdesk/) {
	$newpath = '/page/responseformulier' if $newpath eq '/';
	$newhost = 'www.mywaypoint.nl';
}
elsif ($uri =~ /palm/) {
	$newpath = "/gps_gsm_pda.html" if $newpath eq '/';
}
elsif ($uri =~ /occasion/) {
	$newpath = "/occasions/" if $newpath eq '/';
}
elsif ($host =~ /nieuwsbrief/ or $uri =~ /nieuwsbrief/) {
	$newpath = '/nieuwsbrief.html' if $newpath eq '/';
}
elsif ($host =~ /gps-?tracks/ or $host =~ /tracks\.gps\.nl/) {
	$newhost = 'www.gpstracks.nl';
	$newpath = $uri;
}
elsif ($host =~ /tv\.gps\.nl/) {
	$newhost = 'www.youtube.com';
	#Hans $newpath = '/garmintv';
	$newpath = '/WayPointGPS' if $newpath eq '/';
}
#elsif ($host =~ /evenementenwei(de)?\.nl/) {
#	$newhost = 'hetplatteland.nl';
#	$newpath = $uri;
#}
elsif ($host =~ /evenementenwei/) {
	$newhost = 'www.evenementenweide.nl';
	$newpath = $uri;
}
elsif ($host =~ /reggestreek(fiets|wandel)(vier|4)daagse/) {
	$newhost = "reggestreek${1}4daagse.nl";
	$newpath = $uri;
}
elsif ($host =~ /waypointgps\.eu/) {
	$newhost = 'www.waypointgps.eu';
}
elsif ($host =~ /(\bgalileo-tc|cursus|ttc|training)\b/) {
	$newhost = 'www.gps.nl';
	$newpath = '/cursus/';
	if ($uri eq '/page/basecamp_voor_windows_cursus' or $uri eq '/page/mapsource_cursus') {
		$newpath = '/cursus/cursussen/cursussen/basecamp-cursus.html';
	}
	elsif ($uri eq '/page/motor_basis') {
		$newpath = '/cursus/cursussen/cursussen/motorbasis-cursus.html';
	}
	elsif ($uri eq '/page/outdoor_cursus') {
		$newpath = '/cursus/cursussen/cursussen/outdoor-cursus.html';
	}
	elsif ($uri eq '/page/outdoor_dagtraining') {
		$newpath = '/cursus/cursussen/cursussen/outdoor-dagtraining.html';
	}
	elsif ($uri eq '/page/aanmelden') {
		$newpath = '/cursus/help.html';
	}
	elsif ($uri eq '/page/cursus_voor_uw_club') {
		$newpath = '/cursus/cursussen/cursussen/opleiding-op-maat.html';
	}
	elsif ($uri =~ /\.(gif|jpg)$/) {
		$status = 404;
	}
}
elsif ($host =~ /steuerberater\.nl/) {
	$newhost = 'www.kolkman-nl.com';
	$newpath = '/index.php?lang=de' if $newpath eq '/';
}
elsif ($host eq 'wusage.gps.nl') {
	$status = '403';
}
elsif ($uri =~ /nuvi/) {
	$newpath = '/autonavigatie/garmin_nuvi.html';
}
elsif ($host =~ 'zumolock\.(?:com|nl)') {
	$newhost = 'www.zumolock.com';
	$newpath = $uri;
	if ($newpath eq '/') {
		if ($1 eq 'nl') {
			$newpath = '/index.php/nl/';
		}
	}
}
elsif ($host =~ 'zumotwist\.com') {
	$newhost = 'www.zumolock.com';
	$newpath = $uri;
	if ($newpath eq '/') {
		$newpath = '/index.php/zumotwist';
	}
}
elsif ($host =~ /teqsprayer\.nl/) {
	$newhost = 'www.teqsprayer.nl';
	$newpath = $uri;
}
elsif ($host =~ 'schubert' or $host =~ 'motorhelmenshop\.nl') {
#	$newhost = "www.motorhelmenshop.nl";
#	$newpath = $uri;
	$newhost = "www.gps.nl";
	$newpath = '/schuberth/';
}
elsif ($host eq 'montage-nieuw.gps.nl') {
	$newhost = $host;
	$newpath = $uri;
}
elsif ($host eq 'waypointtravel.nl' or $host eq 'www.waypointtravel.nl' or $host eq 'wptravel.nl' or $host eq 'www.wptravel.nl') {
	$newhost = 'www.waypointtravel.nl';
	$newpath = $uri;
}
elsif ($host eq 'notter-zuna.nl' or $host eq 'www.notter-zuna.nl') {
	$newhost = 'www.notter-zuna.nl';
	$newpath = $uri;
}
elsif ($host eq 'havinga-notter.nl' or $host eq 'www.havinga-notter.nl') {
	$newhost = 'www.havinga.eu';
	$newpath = $uri;
}
elsif ($host =~ 'rwtwente\.nl') {
	$newhost = 'www.runnersworldtwente.nl';
	$newpath = $uri;
}
elsif ($host eq 'doc.gps.nl') {
	$newhost = $host;
	$newpath = $uri;
}
elsif ($host eq 'mulhofhoeve.nl' or $host eq 'www.mulhofhoeve.nl') {
	$newhost = 'www.mulhofhoeve.nl';
	$newpath = $uri;
}
elsif ($host eq 'teravest-notter.nl' or $host eq 'www.teravest-notter.nl') {
	$newhost = 'www.teravest-notter.nl';
	$newpath = $uri;
}
elsif ($host eq 'pigresearchcentre.nl' or $host eq 'www.pigresearchcentre.nl') {
	$newhost = 'www.pigresearchcenter.nl';
	$newpath = $uri;
}
elsif ($host eq 'pigresearchcenter.nl') {
	$newhost = 'www.pigresearchcenter.nl';
	$newpath = $uri;
}
# tegen domme mensen die overal altijd www. voortypen
elsif ($host =~ /^www\.(.+)/) {
	$newhost = $1;
}
elsif ($host eq 'x') {
	$status = 403;
}

if ($host =~ /multiposting/ or
    $host =~ /hrappstore/ or
    $host =~ /hroffice/ or
    $host =~ /84\.241\.182\.21/) {
    	$status = 410;
}
if ($uri =~ /%28SELECT%20/ or
    $uri =~ /;SELECT%20/ or
    $uri =~ /%20UNION%20ALL%20/ or
    $uri =~ /%20ORDER%20BY%20/ or
    $uri =~ /WAITFOR%20DELAY%20/ or
    $uri =~ /%20AND%20/ or
    $uri =~ /%2Fetc%2Fpasswd/) {
    	$status = 403;
}

if (open(LOGFD, ">>$logFile")) {
	$logOpen = 1;
	print LOGFD now() . ' ' . $ENV{'REMOTE_ADDR'} . ": $referer -> $user_agent: proto = $origproto, host = $host, URI = $uri ";
}

# if ($uri eq '/robots.txt') {
# 	print "Status: 200\n";
# 	print "Content-Type: text/plain\n";
# 	print "\n";
# 	print "User-agent: *\nDisallow: /\n";
# 	print LOGFD "-> disallow *\n";
# 	exit 0;
# }

# if ($newpath ne '') {
	if ($status == 301) {
		print "Status: 301 Moved Permanently\n";
	}
	elsif ($status == 302) {
		print "Status: 302 Moved Temporarily\n";
	}
	else {
		print "Status: $status\n";
	}
# }

if ($status > 300 and $status < 303) {
	if ($newhost eq 'www.gps.nl' or $newhost eq 'snelbalie.gps.nl' or $newhost eq 'help.gps.nl' or $newhost eq 'www.youtube.com') {
		$proto = 'https';
	}
	print "Location: $proto://$newhost$newpath\n";
	if ($logOpen) {
		print LOGFD "-> $proto://$newhost$newpath\n";
		close LOGFD;
	}
	print "\n<html><body>Verplaatst naar <a href=\"$proto://$newhost$newpath\">$proto://$newhost$newpath</a></body></html>";
}
else {
	if ($logOpen) {
		print LOGFD "-> status $status\n";
		close LOGFD;
	}
	print "\nstatus $status";
}


exit 0;
