Disable/enable the proxy on a tab by tab basis in Firefox

Is it possible to disable/enable the proxy connection on a tab-by-tab basis in Firefox?

I can access the internet with the proxy enabled, and I can access our internal servers with the proxy disabled, but neither configuration allows the other.

I have a feeling that Firefox 4's per tab profiles may permit this, but was wondering whether there was a way to achieve this on Firefox 3.6.13, perhaps through the use of an extension.

For the moment I'm making do with quickProxy (not QuickProxy which I've just discovered while trying to find quickProxy) which allows me to switch the proxy on and off for the whole browser, but would prefer something more fine-grained.


I recently discover this FireFox extension that might work for you:

https://addons.mozilla.org/en-US/firefox/addon/container-proxy/

this seems to allow you to configure a proxy per-container and you can certainly attach one or more tabs to the container as needed.


Another vote for FoxyProxy but I'll suggest using the PAC feature if your setup is complex. I have two proxy servers to choose from, but which one to choose gets very tricky sometimes. In order to setup FoxyProxy to use the PAC, go to the Proxy Details tab and select Automatic Proxy Configuration URL and enter something like file:///home/me/.myproxy.pac. Here's an example of a PAC file:

function FindProxyForURL(url, host)
{
   var DIRECT = "DIRECT";
   var PROXY = "PROXY myproxy.company.com:80";
   var LOCAL = "PROXY localhost:8118";

   var rc = "";

// alert("My IP Address is: " + myIpAddress());

   // special: DIRECT / localhost
   if (dnsResolve(host) == "127.0.0.1") {
      rc = DIRECT;
   }

   // special: DIRECT / plain name (no domain name (i.e. no dots)) (e.g. http://foobar)
   // (must be local to where I'm at)
   else if (isPlainHostName(host)) {
      rc = DIRECT;
   }

   else {
      // special: LOCAL / not at home & restricted hosts
      if ((dnsDomainIs(host, "frank.home.com")) ||
          (dnsDomainIs(host, "firewall.home.com")) ||
          (dnsDomainIs(host, "backupserver.home.com"))) {
         // determine if we're at home or not; home can resolve the laser printer
         var AT_HOME = (isResolvable("myprinter.home.com") ? true : false);

         if (! AT_HOME) {
            rc = LOCAL;
         }
         else {
            rc = DIRECT;
         }
      }

      // general: DIRECT / not at work
      else {
         // determine if we're at work or not; work can resolve proxy server
         var AT_WORK = (isResolvable("myproxy.company.com") ? true : false);
         if (! AT_WORK) {
            rc = DIRECT;
         }

         // ASSUMED: AT_WORK

         // special: LOCAL / at work & broken work links
         // (must use local proxy server to connect)
         else if ((host == "download.company.com") ||
                  (host == "search.company.com") ||
                  (host == "www.company.com")) {
            rc = LOCAL;
         }

         // general: DIRECT / at work & work intranet links
         else if ((dnsDomainIs(host, ".company.com")) ||
                  (dnsDomainIs(host, ".companylocal.com")) ||
                  (dnsDomainIs(host, ".legacycompany.com"))) {
            rc = DIRECT;
         }

         // general: DIRECT / at work & 192.168.*
         else if (isInNet(host, "192.168.0.0", "255.255.0.0")) {
            rc = DIRECT;
         }

         // default: go through LOCAL
         else {
            rc = LOCAL;
         }
      }
   }

//   alert("Proxy for {" + host + "} is: " + rc);
   return rc;
}

Note that the above example is fairly inefficient as it will usually wind up with a DNS lookup on myproxy.company.com for every single HTTP connection; I hard-code AT_HOME and AT_WORK in the .pac file via an external program at boot time. But it's an example of how complicated you can make your PAC script, if you need to.