this script will automatically(on the fly) translate/resolve subdomian into dedicated folder path.
without touching web server config(
eg:
main domain name:
http://mysite.com
main vhost doc root:
/usr/local/www
Folder inside:
/usr/local/www/brother
/usr/local/www/sister
/usr/local/www/mother
/usr/local/www/father
/usr/local/www/inlaw
/usr/local/www/cucu
/usr/local/www/cicit
/usr/local/www/oneng2
........
so
when browser open url:
http://mysite.com/
it will display:
But when browser open url:
http://brother.mysite.com/
it will display:
content inside folder 'brother', and can view everything inside this folder.
The Script:
#!/usr/bin/perl ######################################## use CGI::Carp qw(fatalsToBrowser set_message); BEGIN {sub handle_errors { my $msg = shift; print qq|Server Error Web Server Error!
$msgPlease inform the mbek about this error.\n|;} set_message(\&handle_errors);} ######################################## use CGI; ## Set a few variables ############################################################## my $hostname = "site.williams"; my $perlexe = "c:/programs/perl/bin/perl.exe"; my $phpexe = "C:/Programs/server/php/php.exe"; ############################################################## if (exists $ENV{'PATH_INFO'}) { $uri_info = $ENV{'PATH_INFO'}; $uri_info =~ s/alias\.pl//; $uri_info =~ s/^\///g; } elsif (exists $ENV{'DOCUMENT_URI'}) { $uri_info = $ENV{'DOCUMENT_URI'}; $member_url =~ s/^http:\/\/.+?\///; $uri_info =~ s/^\///g; $uri_info =~ s/^$member_url//; } else { $uri_info = ''; } my $hosts = $ENV{'HTTP_HOST'}; my $sysdir = $ENV{'DOCUMENT_ROOT'}; my $script = $ENV{'DOCUMENT_NAME'}; my ($hostid,$host) = split /$hostname/, $hosts, 2; $hostid =~ s/\.$//; $sysdir =~ s/\/$//; $sysdir .= "/$hostid" if $hostid; $uri_info =~ s/$script//; $uri_info =~ s/^\///; $uri_info =~ s/\/$//; my $file = "$sysdir"; $file .= "/$uri_info" if $uri_info; $file =~ s/\/$//; if(!-e "$file"){ print "Content-type: text/html\n\n"; print "Invalid Path ($file)"; exit; } if(-d "$file"){ print "Content-type: text/html\n\n"; # load all files of the "data/" folder # into the @files array opendir(DIR, "$file"); my @files = readdir(DIR); closedir(DIR); if(@files){ print "
"; foreach $file (@files) { next if ($file eq "." or $file eq ".."); my $folderpath; if($uri_info){ $folderpath = '/' . $uri_info . '/' . $file; }else{ $folderpath = '/' . $file; } $folderpath = "/". $script . $folderpath if $script && $uri_info ne $script; print "
"; }else{ print "Folder is empty"; } exit; }else{ if($file =~ /\.pl$/i || $file =~ /\.cgi$/i){ #handle perl/CGI my $result = `$perlexe $file`; print "$result"; exit; }elsif($file =~ /\.php$/i){ #handle PHP my $result = `$phpexe $file`; print "$result"; exit; }else{ use File::MMagic; my $mime = File::MMagic->new(); print "Content-type: " . $mime->checktype_filename($file) . "\n"; #The Content-Disposition will generate a prompt to save the file. If you want #to stream the file to the browser, comment out the following line. #print "Content-Disposition: attachment; filename=$filename\n"; print "\n"; binmode STDOUT; if($mime->checktype_filename($file) =~ /image\/png/i){ use GD; my $contents = GD::Image->new( $file ); print $contents->png; }else{ my $fh = new IO::File($file, "r"); my $contents = get_contents($fh); print $contents; } exit; } } exit; ############################ sub get_contents { ############################ my $in = shift; my $ret = ""; while (<$in>) { $ret.= $_; } return $ret; }- $file
"; } print "
and this apache httpd-vhost.conf
<VirtualHost *:80> ServerAdmin me@mysite.com DocumentRoot "/usr/local/www" ServerName mysite.com ServerAlias mysite.com ErrorLog "logs/mysite.com-error.log" CustomLog "logs/mysite.com-access.log" common Options +Includes AddHandler server-parsed .html <Directory "/usr/local/www"> AllowOverride None Options Indexes FollowSymLinks ExecCGI Order allow,deny Allow from all </Directory> RewriteEngine On RewriteRule /(.*)$ /alias.pl/$1 [L] </VirtualHost>
use at your own risk...
happy coding..
No comments:
Post a Comment