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 への簡単なパッチを作成しました。私はこれまでにこれをやったことがないので、おそらく間違った方法で行っていますが、ここにあります.
問題: mod_vhost_alias は、変換された VirtualDocumentRoot が存在しない場合にフェイルオーバーする機能を提供しません。
解決策: 変換された VDR を確認し、ディレクトリが存在しない場合は DECLINE を返します。次に、httpd はデフォルトで通常の DocumentRoot になります (VirtualDocumentRoot と一緒に定義されている場合)。
この動作が「OK」と見なされるかどうかさえわかりません。これは私が必要としていたものであり、利用できないことに少し不満を感じました。誰かが失敗した 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 */