我最近在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
答案 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 */