具有默认备份的Apache Dynamic Virtual Host

时间:2013-11-08 23:40:12

标签: apache virtualhost httpd.conf

我最近在Apache配置中发现了VirtualDocumentRoot的魔力 - 但是直接访问IP或根DNS时需要支持。

服务器是在AWS上运行的EC2实例。基本上,我希望能够处理动态域并在直接访问实例时进行回退。这是我尝试过的(适用于特定域,但不适用于公共DNS地址):

# this is what ideally would serve non-domain requests
<VirtualHost *:80>
    UseCanonicalName Off
    ServerAdmin webmaster@example.com
    DocumentRoot /var/www/hosts/_generic
    ServerName amazonaws.com
    ServerAlias *.amazonaws.com
    ErrorLog logs/generic
</VirtualHost>

# serves dynamic hosts (example.com => /var/www/hosts/example.com)
# note: works as intended
VirtualDocumentRoot /var/www/hosts/%0

1 个答案:

答案 0 :(得分:0)

如果VirtualDocumentRoot不可用,我遇到了一个我有兴趣拥有默认DocumentRoot的情况。我通过http://marc.info/?l=apache-httpd-dev&m=122264826010950&q=raw发布了http://httpd.apache.org/docs/2.2/mod/mod_vhost_alias.html帖子,其中共享了源代码以提供此功能。我希望我有更多的指导。

  

我已经为mod_vhost_alias做了一个简单的补丁。我从来没有这样做过   之前,所以我可能会采取错误的方式,但现在就是这样。

     

问题:mod_vhost_alias无法在事件中进行故障转移   已转换的VirtualDocumentRoot不存在。

     

解决方案:检查已转换的VDR并返回DECLINE(如果目录)   不存在。然后,httpd将默认为常规DocumentRoot(如果   它与VirtualDocumentRoot一起定义。

     

我甚至不确定是否考虑了这种行为&#34;好的&#34; - 它恰到好处   我需要,我有点沮丧,因为它不可用。它   将这样的东西放在单独的配置选项中可能更为谨慎   如果有人依赖于他们从失败的VDR获得的404   转型(我无法想到任何需要的情况   这个,但谁知道?)

     

这是我的补丁,实现了这一点;它可能有点脏,但它   似乎工作正常。它确实引入了一个额外的access()调用   请求;我不是真的认为这是一个问题,但可能是其他人   确实。 (这个补丁是针对2.2.3的debian包源的;   再次,不确定是否可以)

--- mod_vhost_alias.c   2008-09-28 17:06:52.000000000 -0700
+++ mod_vhost_alias_mine.c      2008-09-28 17:02:51.000000000 -0700
@@ -37,7 +37,7 @@
  #include "apr_strings.h"
  #include "apr_hooks.h"
  #include "apr_lib.h"
-
+#include <unistd.h>
  #define APR_WANT_STRFUNC
  #include "apr_want.h"

@@ -250,7 +250,7 @@
      }
  }

-static void vhost_alias_interpolate(request_rec *r, const char *name,
+static int vhost_alias_interpolate(request_rec *r, const char *name,
                                      const char *map, const char *uri)
  {
      /* 0..9 9..0 */
@@ -372,12 +372,19 @@
          ++uri;
      }

+    /* Check accessibility of transformed directory path */
+    if(access(buf, R_OK)) {
+        return 0;
+    }
+
      if (r->filename) {
          r->filename = apr_pstrcat(r->pool, r->filename, buf, uri, NULL);
      }
      else {
          r->filename = apr_pstrcat(r->pool, buf, uri, NULL);
      }
+
+    return 1;
  }

  static int mva_translate(request_rec *r)
@@ -426,7 +433,8 @@
       * canonical_path buffer.
       */
      r->canonical_filename = "";
-    vhost_alias_interpolate(r, name, map, uri);
+    if(!vhost_alias_interpolate(r, name, map, uri))
+       return DECLINED;

      if (cgi) {
          /* see is_scriptaliased() in mod_cgi */