In article <Pine.LNX.3.95.970920184153.11052A-100000@nightshade.z.ml.org>,
Gregory Maxwell <nullc@nightshade.z.ml.org> wrote:
>
>You can do this with Linux and Squid.. It's called transparent proxing,
>unfortuantly there is a rather BIG problem with this, The cache only sees
>the IP and not the URL, so it severly reduces hit rate.. Some people on
>this list use Transparent proxying, they can tell you how it works..
But, the code is _in there_ to proxy based on URL. Because the URL is passed
in the Host: header. It's just not turned on for transparent proxying,
but it is for the accelerator code.
A while ago I posted a patch like the following for squid 1.11 but I never
actually tested it myself (in the great Linus Torvalds tradition :)) however
it did compile. On inspection later I found out it probably didn't work.
I redid it for squid-1.16, this one should work. Here it is
(Leigh if you're reading this you might want to try it :))
diff -ruN squid-1.1.16/src/icp.c squid-1.1.16.test/src/icp.c
--- squid-1.1.16/src/icp.c	Thu Aug 21 21:20:04 1997
+++ squid-1.1.16.test/src/icp.c	Sun Sep 21 04:35:58 1997
@@ -1651,9 +1651,30 @@
         *t = '\0';
     if ((t = strchr(url, '#')))	/* remove HTML anchors */
         *t = '\0';
-    /* see if we running in httpd_accel_mode, if so got to convert it to URL */
-    if (httpd_accel_mode && *url == '/') {
-	/* prepend the accel prefix */
+
+    /*
+     *	If we're not in acceleration mode, and we get a request without
+     *  a hostname look for a Host: header. This is useful for
+     *	transparent proxies.
+     */
+    if (!httpd_accel_mode && *url == '/' &&
+	(t = mime_get_header(req_hdr, "Host")) != NULL) {
+	    strtok(t, " :/;@");
+	    url_sz = strlen(url) + strlen(t) + 32 + Config.appendDomainLen;
+	    icpState->url = xcalloc(url_sz, 1);
+	    if (Config.Accel.port != 80)
+		sprintf(icpState->url, "http://%s:%d%s",
+			t, (int) Config.Accel.port, url);
+		else
+			sprintf(icpState->url, "http://%s%s", t, url);
+
+	    debug(12, 5, "TRANSPROXY REWRITE: '%s'\n", icpState->url);
+    } else if (httpd_accel_mode && *url == '/') {
+	/*
+	 *	If we running in httpd_accel_mode, got to convert it to URL.
+	 *
+	 *	Prepend the accel prefix
+	 */
         if (vhost_mode) {
             /* Put the local socket IP address as the hostname */
             url_sz = strlen(url) + 32 + Config.appendDomainLen;
 
-- | Miquel van Smoorenburg | | | miquels@cistron.nl | Owners of digital watches, your days are numbered. | | PGP fingerprint: FE 66 52 4F CD 59 A5 36 7F 39 8B 20 F1 D6 74 02 |Received on Sat Sep 20 1997 - 19:45:26 MDT
This archive was generated by hypermail pre-2.1.9 : Tue Dec 09 2003 - 16:37:07 MST