OK, I think I have solved getting mod_frontpage to work with a mod_rewrite
virtual host configuration. For the benefit of the archives, here's what I
learned.
(1) The CGIs make use of the SERVER_NAME environment variable
(2) They then look this up in the httpd.conf pointed to by
/usr/local/frontpage/version5.0/www.example.com:80.cnf
and look for a <VirtualHost> container to find the DocumentRoot
So I needed a small patch to mod_frontpage to set SERVER_NAME from HTTP_HOST
(or HTTP_X_FORWARDED_HOST in my proxy environment), and I also needed to
generate a plaintext mini-httpd.conf purely for frontpage to read:
----------------------------------------------------------------------
Port 80
ServerRoot "/usr/local"
ResourceConfig /dev/null
AccessConfig /dev/null
DocumentRoot /usr/local/www/data
<VirtualHost _default_>
ServerName www.example.com
DocumentRoot /usr/local/www/data-example
</VirtualHost>
----------------------------------------------------------------------
Then point /usr/local/frontpage/www.example.com:80.cnf at that:
vti_encoding:SR|utf8-nl
servertype:apache-fp
authoring:enabled
extenderversion:5.0.2.2634
frontpageroot:/usr/local/frontpage/version5.0
serverconfig:/conf/fp.conf
Doing it this way, rather than driving Apache from the <VirtualHost>
containers, means I can add and remove sites dynamically without having to
restart Apache; mod_rewrite looks them up in a separate dbm file.
One other point to note: you should put
AddModule mod_frontpage.c
at the *end* of the AddModules. This is so that it processes the request
first; it looks at the pathname and sets the magic MIME type automatically,
but returns DECLINED so that other modules can perform the actual URI to
Filename translation. As a result, I no longer have to mess with MIME types
in mod_rewrite: just
RewriteCond %{ENV:HOSTMAP} ^(/[^,]+)
RewriteRule ^(/_vti_bin/?.*)$ \
%1$1 [L]
is all I need, where the HOSTMAP environment variable has been set up from a
previous RewriteMap lookup giving the path to the site's root dir.
Regards,
Brian.
--- fpexec.c.orig Tue Aug 2 14:38:31 2005
+++ fpexec.c Wed Aug 3 11:23:41 2005
@@ -125,6 +125,9 @@
"FILEPATH_INFO",
"GATEWAY_INTERFACE",
"LAST_MODIFIED",
+#if 0
+ "NEW_DOCUMENT_ROOT",
+#endif
"PATH_INFO",
"PATH_TRANSLATED",
"QUERY_STRING",
@@ -768,6 +771,53 @@
clean_env();
+ /* fixup environment */
+ {
+ char *e = getenv("HTTP_X_FORWARDED_HOST");
+ if (e)
+ setenv("HTTP_HOST", e, 1);
+ else
+ e = getenv("HTTP_HOST");
+ if (e) {
+ char tmp[256];
+ char *pp;
+ snprintf(tmp, sizeof(tmp), "%s", e);
+ pp = strchr(tmp, ':');
+ if (pp) *pp = '\0';
+ setenv("SERVER_NAME", tmp, 1);
+ }
+#if 0
+ e = getenv("NEW_DOCUMENT_ROOT");
+ if(e) {
+ setenv("DOCUMENT_ROOT", e, 1);
+ unsetenv("NEW_DOCUMENT_ROOT");
+ }
+
+ unsetenv("SCRIPT_URL");
+ unsetenv("SCRIPT_URI");
+#endif
+ }
+
+#if 0
+ /* debugging of script environment */
+ {
+ char **ep;
+ log_msg("cwd: %s\n", cwd);
+ log_msg("fpd (new argv[0]): %s\n", fpd);
+ ep = argv;
+ while (*ep) {
+ log_msg("arg: %s\n", *ep);
+ ep++;
+ }
+ log_msg("arg count: %d\n", ep - argv);
+ ep = environ;
+ while (*ep) {
+ log_msg("%s\n", *ep);
+ ep++;
+ }
+ }
+#endif
+
/*
* Be sure to close the log file so the CGI can't
* mess with it. If the exec fails, it will be reopened
@@ -803,6 +853,52 @@
printf("Content-Type: text/html\n");
fflush(stdout);
}
+
+#if 0
+ /*
+ * Execute the command in a subprocess; sometimes we get <html>
+ * without a header, so fake one up.
+ */
+ {
+ pid_t pid;
+ int status, first;
+ int rpipe[2];
+ FILE *cdata;
+ char buf[256];
+
+ if (pipe(rpipe) < 0) {
+ log_err("pipe failed");
+ exit(255);
+ }
+
+ pid = fork();
+ if (pid < 0) {
+ log_err("fork failed");
+ exit(255);
+ }
+ if (pid == 0) { /* child */
+ close(rpipe[0]);
+ dup2(rpipe[1], 1);
+ execv(fpd, &argv[0]);
+ }
+ close(rpipe[1]);
+ cdata = fdopen(rpipe[0], "r");
+ if (cdata == 0) {
+ log_err("fdopen failed");
+ exit(255);
+ }
+ first = 1;
+ while (fgets(buf, sizeof(buf), cdata) != 0) {
+ if (first && !strncasecmp(buf, "<html>", 6)) {
+ fputs("Content-Type: text/html\r\n\r\n",
stdout);
+ }
+ first = 0;
+ fputs(buf, stdout);
+ }
+ waitpid(pid, &status, 0);
+ exit(WEXITSTATUS(status));
+ }
+#endif
/*
* Execute the command, replacing our image with its own.
---------------------------------------------------------------------
The official User-To-User support forum of the Apache HTTP Server Project.
See <URL:http://httpd.apache.org/userslist.html> for more info.
To unsubscribe, e-mail: [EMAIL PROTECTED]
" from the digest: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]