Monday, November 08, 2010 at 12:06 AM.
system.verbs.builtins.webserver.apache.buildHttpdConf
on buildHttpdConf (adrdomains, mydottedid=nil, dynamicport=5337) {
<<Changes
<<8/25/10; 2:14:33 PM by DW
<<Pass redirects through Frontier.
<<11/22/08; 11:08:13 AM by DW
<<Don't output redirects, we'll keep handling them here.
<<11/21/08; 8:09:58 AM by DW
<<If mydottedid is nil, just use * -- according to the Apache docs this means we don't care what the IP address is. On EC2 the machine has a different idea what its IP address, it's the local one, not the "elastic" one -- which is how the outside world refers to it. Confusing? Yes!
<<11/21/08; 6:40:58 AM by
<<Add comment/code at beginning.
<<11/20/08; 10:29:45 AM by DW
<<Created. Given a table formatted like config.mainresponder.domains, generate text that can be included in an httpd.conf file that allows Apache to serve as a front-end for the dynamic domains, and directly serve the static ones.
local (xmltext = "", indentlevel = 0, adrd, pc = file.getpathchar ());
if mydottedid == nil {
mydottedid = "*"};
on add (s) {
xmltext = xmltext + string.filledstring (" ", indentlevel) + s + "\r\n"};
on frontierHosted (domainname) {
add ("<VirtualHost " + mydottedid + ">"); indentlevel++;
add ("ServerName " + domainname);
add ("ProxyPass / http://" + domainname + ":" + dynamicport + "/");
add ("ProxyPassReverse / http://" + domainname + ":" + dynamicport + "/"); indentlevel--;
add ("</VirtualHost>");
add ("")};
bundle { //add comment/code at the beginning
add ("#");
add ("# Virtual Hosts -- created by the OPML Editor on " + clock.now ());
add ("#");
add ("# " + this);
add ("#");
add ("");
add ("");
add ("ProxyPreserveHost On");
add ("");
add ("NameVirtualHost " + mydottedid);
add ("");
add ("")};
for adrd in adrdomains {
local (domainname = nameof (adrd^));
if domainname == "default" {
continue};
if typeof (adrd^) == addresstype {
frontierHosted (domainname)};
<<add ("<VirtualHost " + mydottedid + ">"); indentlevel++
<<add ("ServerName " + domainname)
<<add ("ProxyPass / http://" + domainname + ":" + dynamicport + "/")
<<add ("ProxyPassReverse / http://" + domainname + ":" + dynamicport + "/"); indentlevel--
<<add ("</VirtualHost>")
<<add ("")
if typeof (adrd^) == stringtype {
if string.lower (adrd^) beginswith "http://" { //redirect
frontierHosted (domainname)}
else {
add ("<VirtualHost " + mydottedid + ">"); indentlevel++;
add ("ServerName " + domainname);
local (folder = adrd^);
if folder endswith pc {
folder = string.delete (folder, sizeof (folder), 1)};
if folder contains " " {
add ("DocumentRoot \"" + folder + "\""); indentlevel--}
else {
add ("DocumentRoot " + folder); indentlevel--};
add ("</VirtualHost>");
add ("")}}};
return (xmltext)};
bundle { //test code
local (f = "C:\\Program Files\\Apache Software Foundation\\Apache2.2\\conf\\extra\\httpd-vhosts.conf");
local (s = buildHttpdConf (@config.mainresponder.domains));
wp.newtextobject (s, @webserver.apache.text);
file.writewholefile (f, s)}
This listing is for code that runs in the OPML Editor environment. I created these listings because I wanted the search engines to index it, so that when I want to look up something in my codebase I don't have to use the much slower search functionality in my object database. Dave Winer.