Project

General

Profile

Mod simple vhost » History » Revision 22

Revision 21 (Sfiera, 2009-01-17 16:16) → Revision 22/24 (Shtirlic, 2009-03-10 16:25)

h1. Simple Virtual-Hosting 

 {{>toc}} 

 *Module: mod_simple_vhost* 

 h2. Description 

 Simple assumption: 

 Every virtual host is in a directory below a base directory in a path that is the same as the name of the vhost. Below this vhost path might be an extra directory which is the document root of the vhost. 

 The document root for each vhost is built from three values: 

 * - server-root 
 * - hostname 
 * - document-root 

 The complete document root is constructed either by 

 <pre> 
 server-root + hostname + document-root 
 </pre> 

 or if this path does not exist by 

 <pre> 
 server-root + default-host + document-root 
 </pre> 

 A small example should make this idea clear: 

 <pre> 
 /var/www/ 
 /var/www/logs/ 
 /var/www/servers/ 
 /var/www/servers/example.org/ 
 /var/www/servers/example.org/lib/ 
 /var/www/servers/example.org/pages/ 
 /var/www/servers/mail.example.org/ 
 /var/www/servers/mail.example.org/lib/ 
 /var/www/servers/mail.example.org/pages/ 

 simple-vhost.server-root = "/var/www/servers/" 
 simple-vhost.default-host = "example.org" 
 simple-vhost.document-root = "pages" 
 </pre> 

 With this setup, requests for "example.org" or "something-else.example.org" will go to @/var/www/server/example.org/pages@, while requests for "mail.example.org" will go to @/var/www/server/mail.example.org/pages@.    You can use symbolic links to map several hostnames to the same directory. 

 h2. Conditionals vs. simple-vhost 

 You have to keep in mind that conditionals and simple-vhost interfere with one another. 

 <pre> 
 simple-vhost.server-root = "/var/www/servers/" 
 simple-vhost.default-host = "example.org" 
 simple-vhost.document-root = "pages" 

 $HTTP["host"] == "news.example.org" { 
     server.document-root = "/var/www/servers/news2.example.org/pages/" 
 }  
 </pre> 

 When @news.example.org@ is requested, the @server.document-root@ will be set to @/var/www/servers/news2.example.org/pages/@, but simple-vhost will overwrite it shortly afterwards. 

 If @/var/www/servers/news.example.org/pages/@ exists, that will be used. If not, @/var/www/servers/example.org/pages/@ will be taken because it is the default. 

 To use conditionals together with simple-vhost, you should do this: 

 <pre> 
 $HTTP["host"] != "news.example.org" { 
     simple-vhost.server-root = "/var/www/servers/" 
     simple-vhost.default-host = "example.org" 
     simple-vhost.document-root = "pages" 
 } 

 $HTTP["host"] == "news.example.org" { 
     server.document-root = "/var/www/servers/news2.example.org/pages/" 
 }  
 </pre> 

 It will enable simple vhosting for all hosts other than @news.example.org@. 

 For two or more hosts: 

 <pre> 
 $HTTP["host"] !~ "^(test1\.example\.org|test2\.example\.org)$" { 
     simple-vhost.server-root           = "/var/www" 
     simple-vhost.document-root         = "/html/" 
     ## the default host if no host is sent 
     simple-vhost.default-host          = "example.org" 
 } 

 $HTTP["host"] == "test1.example.org" { 
     server.document-root = "/home/user/sites/test1.example.org/" 
     accesslog.filename = "/home/user/sites/logs/test1.example.org.access.log" 
 } 

 $HTTP["host"] == "test2.example.org" { 
     server.document-root = "/home/user/sites/test2.example.org" 
     accesslog.filename = "/home/user/sites/logs/test2.example.org.access.log" 
 } 
 </pre> 

 It will enable simple virtual hosting for all hosts other than @test1.example.org@ and @test2.example.org@. 

 Of course you will need to setup permissions for folders (change owner to the user running lighttpd) if you do it like in that example. 

 h2. Options 

 h3. simple-vhost.server-root 

 The root of the virtual host 
  
 h3. simple-vhost.default-host 

 Use this hostname if the requested hostname does not have its own directory 
  
 h3. simple-vhost.document-root 

 The path below the vhost directory 

 h2. Tips 

 Make sure mod_simple_vhost is the first mod in 'server.modules' list,when you are using mod_simple_vhost with mod_cache and mod_proxy. 

 You can configure a virtual host with multiple domain names by using 'or' syntax such as: 

 <pre> 
 $HTTP["host"] =~ "^(hosta\.example\.org|hostb\.example\.net)$" { 
     ... virtualhost configuration here ... 
 } 
 </pre> 

 h2. WWW 

 You do not need to use two entries for example.com and www.example.com.    The following syntax will act as a catch all for both example.com and any subdomains under it: 

 <pre> 
 $HTTP["host"] =~ "(^|\.)example\.com$" { 
     ... 
 } 
 </pre> 

 (Doesn't work for you? If you're not running on the default port, $HTTP["host"] will have the port number appended and the above reg-ex won't match it, since the trailing "$" means "the-string-ends-this-way".)