1

我最近发现了VirtualDocumentRootApache 配置中的魔力——但在直接访问 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
4

1 回答 1

0

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

我为 mod_vhost_alias 做了一个简单的补丁。我以前从未这样做过,所以我可能会以错误的方式进行操作,但就是这样。

问题:如果转换后的 VirtualDocumentRoot 不存在,mod_vhost_alias 无法提供故障转移功能。

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

我什至不确定这种行为是否被认为是“好的”——这正是我所需要的,我对它不可用感到有点沮丧。将这样的东西放在单独的配置选项中可能更谨慎,以防有人依赖他们从失败的 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 */
于 2014-10-28T15:15:26.950 回答