如果 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 */