diff options
author | John Ankarström <john@ankarstrom.se> | 2021-07-13 18:01:42 +0200 |
---|---|---|
committer | John Ankarström <john@ankarstrom.se> | 2021-07-13 18:01:42 +0200 |
commit | 344f64853a083222c0205905dab4ecd41d6570d9 (patch) | |
tree | 1fc70bc1a7fdbbcddc7ed7d09eefd11ff6e9c3ec | |
parent | 7c13a4f0641e6d515da9c87bbb684272236d4251 (diff) | |
download | rbsd-344f64853a083222c0205905dab4ecd41d6570d9.tar.gz |
httpd.conf: Add virtual host configuration
-rw-r--r-- | usr/pkg/etc/httpd/httpd.conf | 123 |
1 files changed, 121 insertions, 2 deletions
diff --git a/usr/pkg/etc/httpd/httpd.conf b/usr/pkg/etc/httpd/httpd.conf index 0d85006..f5166f0 100644 --- a/usr/pkg/etc/httpd/httpd.conf +++ b/usr/pkg/etc/httpd/httpd.conf @@ -108,7 +108,7 @@ LoadModule dir_module lib/httpd/mod_dir.so #LoadModule speling_module lib/httpd/mod_speling.so #LoadModule userdir_module lib/httpd/mod_userdir.so LoadModule alias_module lib/httpd/mod_alias.so -#LoadModule rewrite_module lib/httpd/mod_rewrite.so +LoadModule rewrite_module lib/httpd/mod_rewrite.so LoadModule perl_module lib/httpd/mod_perl.so <IfModule unixd_module> @@ -136,7 +136,7 @@ DocumentRoot "/var/www/rbsd/htdocs" </Directory> <IfModule dir_module> - DirectoryIndex index.html + DirectoryIndex index.php index.html </IfModule> <Files ".ht*"> @@ -235,3 +235,122 @@ SSLRandomSeed startup builtin SSLRandomSeed connect builtin </IfModule> +<Perl> +use warnings; +use subs qw/vhost idn with_idn block/; +use Tie::DxHash; + +# Long-term redirections + +my %redir = ( + 'git.ankarstrom.se' => block( + RewriteRule => '^Apache-Inject\.git/?$ /cpan/Apache-Inject/ [L,R,END]', + RewriteRule => '^([^/]*)\.git(/.*)?$ /$1$2 [L,R,END]', + ), + 'john.ankarstrom.se' => block( + Redirect => '301 /feed.rss /articles.xml', + Redirect => '301 /feed.php /articles.xml', + Redirect => '301 /english/texts/replacing-javascript /replacing-javascript', + Redirect => '301 /web/separation-of-concerns.html /separation-of-concerns', + Redirect => '301 /unix/learning-c.html /learning-c', + Redirect => '301 /scripts http://git.ankarstrom.se/', + Redirect => '301 /software http://git.ankarstrom.se', + Redirect => '301 /ansi-sv-layout /sv-ansi', + ), + 'software.ankarstrom.se' => block( + RewriteRule => '^(win32/)?ahk(/.*)? http://git.ankarstrom.se/ahk/about/ [L,R]', + RewriteRule => '^(win32/)?drm(/.*)? http://git.ankarstrom.se/drm/about/ [L,R]', + RewriteRule => '^(win32/)?run(/.*)? http://git.ankarstrom.se/run/about/ [L,R]', + RewriteRule => '^(win32/)?tt(/.*)? http://git.ankarstrom.se/tt/about/ [L,R]', + RewriteRule => '^(win32/)?watch(/.*)? http://git.ankarstrom.se/watch/about/ [L,R]', + RewriteRule => '^.* http://git.ankarstrom.se/ [L,R]', + ), +); + +# Virtual host configuration + +vhost block(ServerName => 'ankarstrom.se', + ServerAlias => [with_idn 'www.ankarstrom.se'], + DocumentRoot => '/var/www/rbsd/htdocs', +); + +vhost block(ServerName => 'lamnafacebook.nu', + DocumentRoot => '/var/www/facebook/htdocs', + ServerAlias => [with_idn 'www.lamnafacebook.nu'], +); + +vhost block(ServerName => 'git.ankarstrom.se', + Directory => block('/var/www/git/htdocs' => block( + DirectoryIndex => 'cgit.cgi', + Options => '+ExecCGI', + RewriteEngine => 'On', + RewriteCond => '%{REQUEST_FILENAME} !-f', + RewriteCond => '%{REQUEST_FILENAME} !-d', + RewriteRule => '(.*) cgit.cgi/$1 [END,QSA]', + )), +); + +vhost block(ServerName => 'dev.ankarstrom.se'); +vhost block(ServerName => 'img.ankarstrom.se'); +vhost block(ServerName => 'john.ankarstrom.se'); +vhost block(ServerName => 'mail.ankarstrom.se'); +vhost block(ServerName => 'software.ankarstrom.se'); + +# Default virtual host configuration + +sub vhost { + my $vhost = $_[0]; # this should be a hash ref tied to Tie::DxHash + + if (!$vhost->{ServerName}) { + warn 'Call to vhost missing ServerName, skipping virtual host'; + return; + } + + # Merge directives of which only one instance is allowed + if (!$vhost->{DocumentRoot}) { + (my $subdomain = $vhost->{ServerName}) =~ s/\..*//; + $vhost->{DocumentRoot} = "/var/www/$subdomain/htdocs"; + } + + # Merge directives of which multiple instances are allowed + my $default = block( + ServerAlias => idn($vhost->{ServerName}), + Directory => block( + $vhost->{DocumentRoot} => block( + Options => 'Indexes FollowSymLinks', + AllowOverride => 'All', + Require => 'all granted', + exists $redir{$vhost->{ServerName}} ? (RewriteEngine => 'On') : (), + %{$redir{$vhost->{ServerName}}}, + ), + ), + ); + + my @keys = keys %$vhost; + my @values = values %$vhost; + for (my $i = 0; $i < @keys; $i++) { + $default->{$keys[$i]} = $values[$i]; + } + $vhost = $default; + + $VirtualHost{'*:80'} = [@{$VirtualHost{'*:80'}||[]}, $vhost]; +} + +sub idn { + my ($domain) = @_; + $domain =~ s/ankarstrom\.se$/xn--ankarstrm-77a.se/; + $domain =~ s/lamnafacebook\.nu$/xn--lmnafacebook-gcb.nu/; + return $domain; +} + +sub with_idn { + return $_[0], idn $_[0]; +} + +sub block { + my %hash; + tie %hash, 'Tie::DxHash'; + %hash = @_; + return \%hash; +} +</Perl> |