I've developed one of the more popular virtual hosting solutions -- without giving your solution too much thought, it seems reasonable and clever.
Jerry At 12:42 PM 12/7/2001, you wrote: >At BNA we have a problem with use of AOLserver in terms of >how it handles the Location parameter value. The Location >is a fixed value that is a "global constant" for the >AOLserver process. > >In our virtual hosting environment on our production >machines this a problem. The problem is as follows: > >The machine host name is >>> xyz.bna.com >One of many virtual host names is >>> productA.bna.com >User requests >>> http://productA.bna.com/AAAA >(notice that there is no / at the end of the user request) > >According to spec AOLserver should redirect to the complete >url. >Wanted behavior is a redirect to >>> >http://productA.bna.com/AAAA/ > >actual behavior is a redirect to >>> >http://xyz.bna.com/AAAA/ > >Our location is the machine name because we can only set >one. But one location is not sufficient for our needs. I >am aware of the many different Virtual Hosting solutions >that are proposed for AOLserver. But we found a way to fix >our problem without actually needing to use any of the >currently specified Virtual Hosting approaches. I would >like to get your opinion on our approach to solving our >problem. > >In nsd/return.c we have modified the function >Ns_ConnReturnRedirect. Please note the additional block of >code marked with a "ZZZ BNA" comment. What this does is >return the user specified host name in preference to the >Location value. This solves our particular problem. It is >not a Virtual Hosting solution per se, but it does solve our >problem. > >My question is: Do any of you who know the code better than >we do think this is a dangerous thing to do? If so where >should I look in the code to see the danger? Our testing >has shown no problems with this change, at least not so far! > >Here is the modified source code: > >Ns_ConnReturnRedirect(Ns_Conn *conn, char *url) >{ > Ns_DString ds, msg; > int result; > char* host; > > Ns_DStringInit(&ds); > Ns_DStringInit(&msg); > if (url != NULL) { > if (*url == '/') { > > /* ZZZ BNA - we look for a host entry before >defaulting > to the location value. > */ > host = Ns_SetGet(conn->headers, "Host"); > if (host) { > Ns_DStringAppend(&ds, "http://"); > Ns_DStringAppend(&ds, host); > } else { > Ns_DStringAppend(&ds, >Ns_ConnLocation(conn)); > } > } > Ns_DStringAppend(&ds, url); > Ns_HeadersPut(conn, "Location", ds.string); > Ns_DStringVarAppend(&msg, "<A HREF=\"", ds.string, > "\">The requested URL has moved >here.</A>", NULL); > result = Ns_ReturnNotice(conn, 302, "Redirection", >msg.string); > } else { > result = Ns_ReturnNotice(conn, 204, "No Content", >msg.string); > } > Ns_DStringFree(&msg); > Ns_DStringFree(&ds); > return result; >} > >Thanks for the help! > >/pgw >Greg Wolff >[EMAIL PROTECTED] ======================================================== Jerry Asher [EMAIL PROTECTED] 1678 Shattuck Avenue Suite 161 Tel: (510) 549-2980 Berkeley, CA 94709 Fax: (877) 311-8688
