mod_vhost_alias.c revision c5e78f582d171e8e06830ee721e94ba13005b159
1a38107941725211e7c3f051f7a8f5e12199f03acmaeder/* ====================================================================
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu * The Apache Software License, Version 1.1
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu * Copyright (c) 2000-2001 The Apache Software Foundation. All rights
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu * Redistribution and use in source and binary forms, with or without
431571057e88a650a974adec93ea4bb5173b6213Felix Gabriel Mance * modification, are permitted provided that the following conditions
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu * 1. Redistributions of source code must retain the above copyright
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu * notice, this list of conditions and the following disclaimer.
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu * 2. Redistributions in binary form must reproduce the above copyright
19e01e1a7e319063434bd86c8ecbc5f241ef9993Felix Gabriel Mance * notice, this list of conditions and the following disclaimer in
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu * the documentation and/or other materials provided with the
80875f917d741946a39d0ec0b5721e46ba609823Till Mossakowski * distribution.
a604cbad8e2202147b5c6bb9f2e06ae61162d654Felix Gabriel Mance * 3. The end-user documentation included with the redistribution,
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu * if any, must include the following acknowledgment:
be2439588008221e691321fdf4f75432cfb72878Felix Gabriel Mance * "This product includes software developed by the
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu * Apache Software Foundation (http://www.apache.org/)."
fc05327b875b5723b6c17849b83477f29ec12c90Felix Gabriel Mance * Alternately, this acknowledgment may appear in the software itself,
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu * if and wherever such third-party acknowledgments normally appear.
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu * 4. The names "Apache" and "Apache Software Foundation" must
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu * not be used to endorse or promote products derived from this
0dd6e7830de0887c9a12356447975a826b3b3db2Christian Maeder * software without prior written permission. For written
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu * permission, please contact apache@apache.org.
424860079d47bf490fa98d5d7498096a0447c569mcodescu * 5. Products derived from this software may not be called "Apache",
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu * nor may "Apache" appear in their name, without prior written
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu * permission of the Apache Software Foundation.
1a38107941725211e7c3f051f7a8f5e12199f03acmaeder * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
32bbac77828be0233953f8fe476edb0a9585408dChristian Maeder * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
27fdf879983dd28e211b41f3be6c0e930b7c816bFelix Gabriel Mance * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
431571057e88a650a974adec93ea4bb5173b6213Felix Gabriel Mance * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
1a38107941725211e7c3f051f7a8f5e12199f03acmaeder * SUCH DAMAGE.
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu * ====================================================================
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu * This software consists of voluntary contributions made by many
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu * individuals on behalf of the Apache Software Foundation. For more
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu * information on the Apache Software Foundation, please see
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu * Portions of this software are based upon public domain software
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu * originally written at the National Center for Supercomputing Applications,
be00381168b3f10192afabbba136fb06d3a9f358Christian Maeder * University of Illinois, Urbana-Champaign.
7852de3551fc797566ee71165bafe05b6d81728cnotanartist * mod_vhost_alias.c: support for dynamically configured mass virtual hosting
27fdf879983dd28e211b41f3be6c0e930b7c816bFelix Gabriel Mance * Copyright (c) 1998-1999 Demon Internet Ltd.
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu * This software was submitted by Demon Internet to the Apache Software Foundation
27fdf879983dd28e211b41f3be6c0e930b7c816bFelix Gabriel Mance * in May 1999. Future revisions and derivatives of this source code
d0f58d27c2536eba454d8f77de8617bc6a2c99cdFelix Gabriel Mance * must acknowledge Demon Internet as the original contributor of
d0f58d27c2536eba454d8f77de8617bc6a2c99cdFelix Gabriel Mance * this module. All other licensing and usage conditions are those
d0f58d27c2536eba454d8f77de8617bc6a2c99cdFelix Gabriel Mance * of the Apache Software Foundation.
431571057e88a650a974adec93ea4bb5173b6213Felix Gabriel Mance * Originally written by Tony Finch <fanf@demon.net> <dot@dotat.at>.
27fdf879983dd28e211b41f3be6c0e930b7c816bFelix Gabriel Mance * Implementation ideas were taken from mod_alias.c. The overall
424860079d47bf490fa98d5d7498096a0447c569mcodescu * concept is derived from the OVERRIDE_DOC_ROOT/OVERRIDE_CGIDIR
60f30f0eeeacdfc1e0dfe39664373ddf5a0675adFelix Gabriel Mance * patch to Apache 1.3b3 and a similar feature in Demon's thttpd,
60f30f0eeeacdfc1e0dfe39664373ddf5a0675adFelix Gabriel Mance * both written by James Grinter <jrg@blodwen.demon.co.uk>.
9475501a6acf48434052d9e6f4a05ed6681eaaabFrancisc Nicolae Bungiu#include "http_request.h" /* for ap_hook_translate_name */
80875f917d741946a39d0ec0b5721e46ba609823Till Mossakowskimodule AP_MODULE_DECLARE_DATA vhost_alias_module;
0dd6e7830de0887c9a12356447975a826b3b3db2Christian Maeder * basic configuration things
424860079d47bf490fa98d5d7498096a0447c569mcodescu * we abbreviate "mod_vhost_alias" to "mva" for shorter names
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu VHOST_ALIAS_UNSET, VHOST_ALIAS_NONE, VHOST_ALIAS_NAME, VHOST_ALIAS_IP
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu * Per-server module config record.
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroederstatic void *mva_create_server_config(apr_pool_t *p, server_rec *s)
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu conf = (mva_sconf_t *) apr_pcalloc(p, sizeof(mva_sconf_t));
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu conf->doc_root_mode = VHOST_ALIAS_UNSET;
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder conf->cgi_root_mode = VHOST_ALIAS_UNSET;
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiustatic void *mva_merge_server_config(apr_pool_t *p, void *parentv, void *childv)
d3cb3401882f6956de016f8eecbec1cd3b868acbFelix Gabriel Mance mva_sconf_t *parent = (mva_sconf_t *) parentv;
d3cb3401882f6956de016f8eecbec1cd3b868acbFelix Gabriel Mance mva_sconf_t *child = (mva_sconf_t *) childv;
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu conf = (mva_sconf_t *) apr_pcalloc(p, sizeof(*conf));
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu if (child->doc_root_mode == VHOST_ALIAS_UNSET) {
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu conf->doc_root_mode = parent->doc_root_mode;
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu conf->doc_root_mode = child->doc_root_mode;
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu if (child->cgi_root_mode == VHOST_ALIAS_UNSET) {
0dd6e7830de0887c9a12356447975a826b3b3db2Christian Maeder conf->cgi_root_mode = parent->cgi_root_mode;
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu conf->cgi_root_mode = child->cgi_root_mode;
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu * These are just here to tell us what vhost_alias_set should do.
7852de3551fc797566ee71165bafe05b6d81728cnotanartist * We don't put anything into them; we just use the cell addresses.
80875f917d741946a39d0ec0b5721e46ba609823Till Mossakowskistatic const char *vhost_alias_set(cmd_parms *cmd, void *dummy, const char *map)
cf0439f74f1d55a9840d38a88f9b0f4fc00d5547Christian Maeder const char **pmap;
cf0439f74f1d55a9840d38a88f9b0f4fc00d5547Christian Maeder const char *p;
7852de3551fc797566ee71165bafe05b6d81728cnotanartist conf = (mva_sconf_t *) ap_get_module_config(cmd->server->module_config,
cf0439f74f1d55a9840d38a88f9b0f4fc00d5547Christian Maeder /* there ought to be a better way of doing this */
cf0439f74f1d55a9840d38a88f9b0f4fc00d5547Christian Maeder if (&vhost_alias_set_doc_root_ip == cmd->info) {
cf0439f74f1d55a9840d38a88f9b0f4fc00d5547Christian Maeder else if (&vhost_alias_set_cgi_root_ip == cmd->info) {
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu else if (&vhost_alias_set_doc_root_name == cmd->info) {
624f8c31bd8d6746b93f4b5966aa6fc7680fefc5Felix Gabriel Mance else if (&vhost_alias_set_cgi_root_name == cmd->info) {
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu return "INTERNAL ERROR: unknown command info";
b84c87f199dc287d235d7dad6ea344f6912ef531Christian Maeder if (!ap_os_is_path_absolute(cmd->pool, map)) {
7852de3551fc797566ee71165bafe05b6d81728cnotanartist return "format string must be an absolute path, or 'none'";
431571057e88a650a974adec93ea4bb5173b6213Felix Gabriel Mance /* sanity check */
b90f0b7fd6ccfbdd7e5adb65b1f6c02c7758ff5cmcodescu while (*p != '\0') {
b90f0b7fd6ccfbdd7e5adb65b1f6c02c7758ff5cmcodescu if (*p++ != '%') {
b90f0b7fd6ccfbdd7e5adb65b1f6c02c7758ff5cmcodescu /* we just found a '%' */
b90f0b7fd6ccfbdd7e5adb65b1f6c02c7758ff5cmcodescu /* optional dash */
b90f0b7fd6ccfbdd7e5adb65b1f6c02c7758ff5cmcodescu if (*p == '-') {
b90f0b7fd6ccfbdd7e5adb65b1f6c02c7758ff5cmcodescu /* digit N */
b90f0b7fd6ccfbdd7e5adb65b1f6c02c7758ff5cmcodescu return "syntax error in format string";
b90f0b7fd6ccfbdd7e5adb65b1f6c02c7758ff5cmcodescu /* optional plus */
b90f0b7fd6ccfbdd7e5adb65b1f6c02c7758ff5cmcodescu if (*p == '+') {
if (apr_isdigit(*p)) {
return NULL;
{ NULL }
if (r->filename) {
int ndots;
ndots = 0;
for (p = name; *p; ++p){
while (*map) {
++map;
++map;
++map;
++map;
if (N > ndots) {
else if (!Nd) {
if (!Np) {
if (!Np) {
else if (!Md) {
if (!Mp) {
if (!Mp) {
++uri;
if (r->filename) {
const char *cgi;
if (cgi) {
return DECLINED;
return DECLINED;
if (cgi) {
return OK;