Re: proxy.pac

From: Niall Doherty <eeindy@dont-contact.us>
Date: Tue, 19 Aug 1997 17:12:57 +0100

Simon Haighton-Williams wrote:
>
> Dear list,
> I need some help with writing a proxy.pac that sets the correct
> proxy based on the DNS name of the client. For example a client dials
> into modem 20 in location foo - they get the DNS name
> rack20-foo.somecompany.co.uk I want them to use the cache
> webcache-foo.somecompany.co.uk.
> Regards,
> Simon
>

We have a number of sites in Ireland - two in Dublin and
one in the center of Ireland. We have one cache in Dublin and
one at the remote site.

Here's what I use (modified slightly). The DNS name of your
client isn't available to your server without doing a (reverse)
DNS lookup AFAIK. It would be far faster to use the IP address
to base your decisions on if possible.

Our proxy.pac is actually a Perl CGI script that uses the
REMOTE_ADDR environment variable to test the IP address and
decides on their location. It then sets a couple of variables
and outputs JavaScript that the client can use. This also
has the benefit that the client doesn't have to go through the
DNS-figuring-out part every time - it's done before the client
even gets the JavaScript.

For this to work, your web server needs to know that the
proxy.pac is a CGI script (/cgi-bin directory ?) and the CGI
script has to be careful to use:

  Content-type: application/x-ns-proxy-autoconfig

Anyway, here it is. Hope it helps...

Look out for the <SNIP>ed and <MODIFIED> sections :-)

Cheers,
Niall

---
#!/usr/local/bin/perl
$remote_addr = $ENV{'REMOTE_ADDR'};
# Set proxy server depending on location.
# Athlone: .a.b.c1 - a.b.c2 range    <MODIFIED (as below)>
# Dublin: ... the rest of the IP range...
# ecn=Ericsson Corporate Network
if ($remote_addr =~ /a.b.c[1-2]/)
  {
   $ecn_direct = "DIRECT; " .
                 "PROXY octopus.eei.ericsson.se:3128; " .
                 "PROXY squid.eei.ericsson.se:3128";
   $ecn_proxy  = "PROXY octopus.eei.ericsson.se:3128; " .
                 "PROXY squid.eei.ericsson.se:3128; " .
                 "DIRECT";
   $ex_proxy   = "PROXY octopus.eei.ericsson.se:3128; " .
                 "PROXY squid.eei.ericsson.se:3128; " .
                 "PROXY external1.ericsson.se:X; " .     <MODIFIED,
obviously>
                 "PROXY external2.ericsson.se:Y";        <MODIFIED -
same below...>
   $ex_sproxy  = "PROXY octopus.eei.ericsson.se:3128; " .
                 "PROXY squid.eei.ericsson.se:3128; " .
                 "PROXY s-proxy.ericsson.se:80";
   $ex_direct  = "PROXY external1.ericsson.se:X; " .
                 "PROXY external2.ericsson.se:Y";
  }
else
  {
   $ecn_direct = "DIRECT; " .
                 "PROXY squid.eei.ericsson.se:3128" ;
   $ecn_proxy  = "PROXY squid.eei.ericsson.se:3128; " .
                 "DIRECT";
   $ex_proxy   = "PROXY squid.eei.ericsson.se:3128; " .
                 "PROXY external1.ericsson.se:X; " .
                 "PROXY external2.ericsson.se:Y";
   $ex_sproxy  = "PROXY squid.eei.ericsson.se:3128; " .
                 "PROXY s-proxy.ericsson.se:80";
   $ex_direct  = "PROXY external1.ericsson.se:X; " .
                 "PROXY external2.ericsson.se:Y";
  }
print <<"EOI";
Content-type: application/x-ns-proxy-autoconfig
// ECN = Ericsson Corporate Network
function FindProxyForURL(url, host)
  {
   // Local network.
   if (isPlainHostName(host) ||
<SNIP>
       dnsDomainIs(host, ".eei.ericsson.se") ||
       dnsDomainIs(host, ".lmi.ericsson.se"))
     return "DIRECT" ;
   // ECN (excluding local network).
   else if (dnsDomainIs(host, "..." <SNIP>
<SNIP>
           ))
          {
           //
------------------------------------------------------------
           // Special cases - go directly for CGI scripts:
           // and ... <SNIP>
           if (shExpMatch(url, "http://*/cgi-bin/*") ||
<SNIP>
             return "$ecn_direct";
           // End of special cases
           //
------------------------------------------------------------
   
           // For HTTP go through our own cache for performance.
           // For FTP go through our own cache to make it work for
           // ftp servers with a root directory other than "/" - this
           // doesn't work in Netscape 2.0x or 3.0 but Squid handles
           // it quite well.
           if (shExpMatch(url, "http:*") ||
               shExpMatch(url, "gopher:*") ||
               shExpMatch(url, "ftp:*"))
             return "$ecn_proxy";
           else
             return "$ecn_direct";
          }
   // External to ECN.
   else
     {
      // For HTTP, FTP and Gopher sites our standard proxies can handle
it.
      // Use local proxies, then EDT proxy.
      if (shExpMatch(url, "http:*") ||
          shExpMatch(url, "ftp:*") ||
          shExpMatch(url, "gopher:*"))
        return "$ex_proxy" ;
      // For secure transfers use our own, then Security proxy.
      else if (shExpMatch(url, "https:*") ||
               shExpMatch(url, "snews:*"))
             return "$ex_sproxy";
      // For WAIS and News use gateway.
      else
        return "$ex_direct" ;
     }
  }
EOI
-- 
Niall Doherty
Systems Engineer
Ericsson Systems Expertise Ltd.,
Beech Hill,                     Telephone: +353 1 207 7506
Clonskeagh,                     Telefax:   +353 1 269 3153
Dublin 4,                       Email:     eeindy@eei.ericsson.se
Ireland.                        MemoID:    EEI.EEINDY
                                ECN:       830 7506
Received on Tue Aug 19 1997 - 09:16:53 MDT

This archive was generated by hypermail pre-2.1.9 : Tue Dec 09 2003 - 16:36:47 MST