AutoProxy-Konfiguration

Die Javascript Funktion FindProxyForURL

Jeder Browser an jedem einzelnen PC in einem lokalen Netzwerk (LAN) muss den Weg zum Internet kennen. Dazu muss man im schlimmsten Fall alle Browser-Programme an allen PCs manuell konfigurieren. Die Konfiguration lässt sich mit Javascript nicht nur bequem automatisieren, sondern auch variabel anpassen. Diese von Netscape stammende Erfindung funktioniert heute mit allen gängigen Browsern.
Javascript ECMAScript für HTML und XML
Netzwerk Zusammenarbeit - Lokal und weltweit - Router & Proxy
Router & Proxy   Browser-Konfiguration zur Verwendung eines Proxy-Servers
FindProxyForURL Javascript-Funktion zur Proxy-Konfiguration
AutoProxy Ein einziges zentrales Script für alle PC & Browser
DHCP/WPAD Vollautomatische Konfiguration mit DHCP-Server und Web Proxy AutoDiscovery
HTTP/WPAD Vollautomatische Konfiguration mit WebServer und WPAD
Umgebungs-Variable des Betriebssystems: HTTP_PROXY und seine Verwandten
Spezielle Programmierung des AutoProxy-Programms
Konfigurations-Varianten je nach Browser-Adresszeile
Konfigurations-Varianten je nach dem adressierten Server
Konfigurations-Varianten je nach IP-Adresse des Client-PC
Ergebvnis-String der Funktion FindProxyFor URL
Interaktive Funktionen können nicht verwendet werden.
Perl & PHP Individuelle AutoProxy-Programmierung mit Server-Programmiersprachen
Links Ausgewählte Links zum Thema 'AutoProxy'

Router & Proxy-Server

Jedes lokale Netzwerk (LAN) ist normalerweise an einem Punkt mit dem Internet verknüpft. Diese Funktion wird durch eine Hardware-Box (meist mit einem fix konfigurierten Linux-Server) oder durch einen PC ausgeführt.
Der → Router oder Proxy-Server ist (wie jedes gemeinsam genutzes Gerät) an einer fixen → IP-Adresse ins LAN eingebunden. Er akzeptiert Aufträge nur an einem bestimmten → Port. Darüber hinaus kann man den Zugang an einen User-Namen + Passwort binden.
Die Zugangs-Daten - Adresse und Port (allenfalls auch UserName und Passwort) - müssen an jedem einzelnen PC im LAN bekannt sein.
Details zu den Themen Netzwerk, Router, Proxy, IP-Adresse, Port

Browser-Konfiguration

Jeder Browser an jedem einzelnen PC im LAN muss zur Verwendung des Routers / Proxy-Servers konfiguriert werden. Dazu stehen mehrere alternative Methoden zur Verfügung:
Manuelle Konfiguration
Umgebungs-Variable des Betriebssystems (Linux, Windows)
AutoProxy-Methode (auf dieser Webseite)
Größere Netzwerke verwenden fast immer die AutoProxy-Methode.
Zentrale Einstellung
Mit AutoProxy ist es möglich, in einer einzigen zentralen Datei die Konfiguration aller Browser an allen PC im LAN zu steuern.
Konfigurations-Varianten
Die Methode bietet Möglichkeiten zur bedingten Verzweigung, Je nach dem gewünschten Dienst (http, ftp, file, ..) oder nach der IP-Adresse eines PC kann eine andere Proxy-Einstellung konfiguriert werden.
Einfache Änderung
Eine Änderung der Proxy-Konfiguration erfordert lediglich die Änderung einer einzigen Text-Datei. Die Einstellung aller (!) PC und Browser im lokalen Netzwerk bleibt gleich. So ist auch eine rasche Reaktion auf einen Proxy-Ausfall möglich.
Proxy-Alternativen
Mit AutoProxy kann man eine Liste mehrerer Proxy-Server angeben. Wenn der erste Proxy ausfällt, wird automatisch der zweite verwendet, usw.

Praktische Ausführung:

Die Konfiguration erfolgt durch eine Javascript-Funktion, die in einer eigenen Datei zur Verfügung steht, und die normalerweise vom (eigenen) Webserver des lokalen Netzwerks bezogen wird.

Leider ist es nicht einfach, brauchbare Informationen zu dieser Funktion zu finden. In der Javascript-Doku sucht man danach meist vergeblich.
Im Internet ergibt der Such-Begriff FindProxyForURL die meisten brauchbaren Treffer.

Übersicht

Auf dieser Seite werden einige Varianten zur Einstellung der Proxy-Daten vorgestellt.

Wenn sie ein fertig konfiguriertes LAN/WLAN-Router-Gerät verwenden, dann ist darin meist ein Linux-Server enthalten, welcher DHCP-Server, Webserver, Router und Proxy-Server betreibt und fast immer eine vollautomatische ↓ DHCP/WPAD-Konfiguration aller an das Netzwerk (LAN) angeschlossenen Computer erlaubt. Diese Router werden meist über ein Webseiten-Interface gesteuert, mit dessen Hilfe man die Konfiguration kontrollieren und bei Bedarf ändern kann.

Wenn sie für ihr LAN einen eigenen Server-PC verwenden, dann laufen darauf meistens DHCP-Server und Webserver. In diesem Fall verwenden sie am besten die vollautomatische Konfiguration mit ↓ DHCP/WPAD. Diese Methode funktioniert am besten und unabhängig davon, ob der Router am gleichen Server-PC oder auf einem anderen Gerät läuft.

Wenn sie für ihr LAN mindestens einen Webserver betreiben, dann kann dieser die Proxy-Daten an alle angeschlossenen Geräte mitteilen. In diesem Fall verwenden sie am besten die Konfiguration mit ↓ DNS/WPAD (HTTP/WPAD). Sie funktioniert meistens, ist jedoch weniger zuverlässig als DHCP/WPAD.

Wenn sie einen Webserver betreiben, jedoch die automatische Konfiguration mit DNS/WPAD nicht funktioniert, dann stellen sie an den betroffenen Browsern die Adresse der AutoProxy-Datei manuell ein.

Ohne Webserver definieren sie am besten die standardisierten Umgebungs-Variablen ihres Betriebssystems ein. Diese Arbeit muss man zwar an jedem PC einzeln ausführen, dafür sollten jedoch alle darauf laufenden Browser die Proxy-Konfiguration automatisch erkennen.

Wenn sie keine automatische Konfiguration wünschern, oder wenn alle Methoden dazu versagen, dann müssen sie Adresse und Port ihres Proxy an jedem Browser manuell einstellen.

FindProxyForURL

Es ist möglich, mit einem kleinen Programm in der Programmiersprache → Javascript die Zugangs-Daten zum Proxy/Router an beliebige PC des eigenen Netzwerks mitzuteilen. Diese Methode bildet die Grundlage allr auf dieser Seite vorgestellten Verfahren. Für einfache Fälle sind dazu keine Programmier-Kenntnisse erforderlich.
Voraussetzungen für dieses einfache Beispiel:
Ihr privates Netzwerk umfasst mindestens einen PC und ist über einen → Router oder Proxy-Server mit dem Internet verbunden. (d.h. ihr PC ist nicht direkt mit dem Internet verbunden).
Sie kennen IP-Adresse und Port ihres Proxy.
Hinweis: Hier wird die IP-Adresse auf der LAN-Seite des Proxy benötigt - Die ersten 3 Zahlen der Adresse sind normalerweise gleich wie in der IP-Adresse ihres eigenen PC. Wenn ihr PC schon bisher über den Router mit dem Internet verbunden war, dann finden sie IP-Adresse und Port des Proxy meist in den Browser-Einstellungen (Extras | Netzwerk | ...)

AutoProxy-Datei (PAC-Datei)

Erstellen sie eine Text-Datei mit dem Namen
autoproxy.pac
und tragen sie diesen Text ein:
function FindProxyForURL(url,host) {
var px="PROXY 192.168.0.1:8080;";
return px;
}
Ersetzen sie das hier verwendete Beispiel (rot) durch IP-Adresse und Port ihres eigenen Proxy.

Webserver

Wenn sie einen → Webserver im eigenen LAN betreiben, dann verschieben sie die erzeugte AutoProxy-Datei in sein Arbeitsverzeichnis - Das ist jenes Verzeichnis, in dem sich auch ihre Start-Datei index.html befindet, z.B.
/srv/www/htdocs/autoproxy.pac
C:\MeinWeb\htdocs\autoproxy.pac
Erteilen sie Lese-Rechte (read) für jenen User, welcher den Webserver betreibt (z.B. auf Linux wwwrun, auf Windows System-User).
Tipp: Unter bestimmten Umständen kann man den eigenen Webserver auch zur vollautomatischen Proxy-Konfiguration mit ↓ DNS/WPAD (HTTP/WPAD) verwenden.

Kein Webserver

In diesem Fall verschieben sie die AutoProxy-Datei an einen leicht auffindbaren Pfad ihres PC, z.B.
/home/test/autoproxy.pac
C:\autoproxy.pac
Erteilen sie Lese-Rechte für alle User. Hinweis: Manche Browser akzeptieren nur Web-Adressen und keine Pfade zu lokalen Dateien.

Browser

Zuletzt wird ein Browser ihres PC eingestellt.
Öffnen sie das Konfigurations-Menü (meist Extras | Netzwerk oder ähnl.) und notieren sie zur Sicherheit die aktuelle Einstellung (z.B. manueller Eintrag von Proxy-Adresse und -Port).
Aktivieren die AutoProxy (meist ein Auswahl-Button oder -Kästchen) und tragen sie die Adresse des Konfigurations-Scrips ein:
Wenn sie das Script am eigenen Webserver verwenden, dann tragen sie die Web-Adresse ein, z.B.
http://192.168.0.2/autoproxy.pac
Ersetzen sie das Beispiel (rot) durch Name oder IP-Adresse ihres eigenen lokalen Webservers.
Wenn sie die Datei am eigenen PC verwenden, dann tragen sie den Pfad dorthin ein, z.B.
c:\autoproxy.pac

MIME-Type

Meist wird eine vom Webserver gelieferte Datei autoproxy.pac ohne weitere Maßnahmen richtig interpretiert. Die → MIME-Type Liste des Betriebssystems (Linux: /etc/mime.types) enthält diesen Typ jedoch nicht immer. Man kann zur Sicherheit oder bei Problemen diese Zeile eintragen:
application/x-ns-proxy-autoconfig pac

Alternative: Man kann die MIME-Type mit einer AddType Anweisung in der Konfiguration des → Apache-Webservers hinzufügen:
AddType application/x-ns-proxy-autoconfig .pac

Test:

Beenden sie das Browser-Programm und starten sie es erneut. Damit wird sichergestellt, dass die neue Konfiguration geladen wird.
Leeren sie das Browser-Cache (z.B. Extras | Temporäre Dateien | Löschen ...)
Kontrollieren sie an einem anderen PC oder mit einem anderen Browser am gleichen PC, ob eine funktionierende Verbindung mit dem Internet besteht.
Falls nicht: Stellen sie die Verbindung her, sonst kann keiner der folgenden Tests durchgeführt werden.
Versuchen sie, eine Internet-Seite zu öffnen, z.B. eine Suchmaschine.
Wenn die Webseite angezeigt wird, dann funktioniert das einfache AutoProxy-Script.
Wenn sie nach langer Wartezeit eine Fehlermeldung erhalten, dann ist vermutlich die Verbindung zwischen Proxy und Internet unterbrochen, oder die IP-Adresse des Proxy falsch eingestellt.
Wenn sie rasch eine Fehlermeldung erhalten, dann ist vermutlich der Proxy-Port falsch eingestellt.

Versuchen sie, eine Webseite am eigenen PC oder am eigenen Webserver zu öffnen.
Wenn die Webseite angezeigt wird, dann funktioniert das einfache AutoProxy-Script, sollte jedoch trotzdem ergänzt werden (weitere Kapitel dieser Seite).
Wenn das Öffnen von Internet-Webseiten funktioniert, das Öffnen eigener Webseiten jedoch nicht, dann muss das AutoProxy-Script ergänzt werden: Für Webseiten am eigenen PC oder Webserver bzw. im eigenen LAN müssen Ausnahmen eingetragen werden.

AutoProxy für alle PC & Browser eines Netzwerks

Voraussetzungen:

Ihr AutoProxy Script wurde installiert und getestet.
Webseiten am eigenen PC und am eigenen Webserver werden korrekt angezeigt.
Internet-Webseiten werden korrekt angezeigt.

Sinnvolle Ergänzung:

Testen sie an einem PC möglichst alle Browser und -Versionen, die in ihrem LAN verwendet werden. Noch besser ist dazu ein → Virtueller PC geeignet.

Webserver

Wenn sie die Webserver-Variante verwenden, dann ändern sie die Konfiguration aller Browser an allen PC im Netzwerk:
Aktivieren sie AutoProxy-Konfiguration und tragen sie die gleiche Adresse ein wie am Test-PC.

Kein Webserver

Wenn sie keinen Webserver betreiben, dann kopieren sie die Konfigurations-Datei auf ein gemeinsam verwendetes Netzlaufwerk oder (im jeweils gleichen Pfad) auf jeden PC im Netzwerk.
Aktivieren sie AutoProxy-Konfiguration und tragen sie den Pfad zur Konfigurations-Datei ein.

Sicherheit

Der AutoProxy-Mechanismus kann als ganz einfache Sicherheits-Maßnahme verwendet werden. Das ergibt jedoch nur in der Webserver-Variante einen Sinn und auch dann nur bei Kombination mit anderen Maßnahmen.

Die Verwendung von AutoProxy erfolgt freiwillig - Jeder Browser kann manuell anders konfiguriert werden und damit ihr AutoProxy-Script umgehen !

Auto-Konfiguration

In größeren Netzwerken ist es sinnvoll, mehrere unterschiedliche Konfigurationen (nicht nur AutoProxy) automatisch auszuführen.
In diesem Fall entfällt auch die manuelle Eintragung der AutoProxy-Adresse.

In Windows-Netzwerken verwenden sie dazu die System-Richtlinien (Policy, poledit.exe) bzw. die Gruppen-Richtlinien.

Web Proxy AutoDiscovery Protocol WPAD mit DHCP

Auch die Konfiguration einer AutoProxy-Datei ist ein manueller Vorgang, der zur Sicherheit und Bequemlichkeit besser automatisch ausgeführt werden sollte. Dazu gibt es mehrere Möglichkeiten. Alle verwenden einen Server (→ DHCP, → Webserver), der ohnehin in jedem lokalen Netzwerk selbstverständlich ist.

WPAD mit DHCP-Server

Erste Wahl ist ein → DHCP-Server
Dieser Server im lokalen Netzwerk (LAN) dient hauptsächlich dazu, jedem PC beim Hochfahren eine IP-Adresse zuzuweisen.
Zusätzlich ist es möglich und sinnvoll, dem PC wichtige Konfigurations-Daten des LAN mitzuteilen, z.B. Adresse und Port des Routers / Proxy-Servers.
Nicht nur das Betriebssystem (beim Hochfahren) sondern auch jedes andere Programm kann den DHCP-Server verwenden. Wenn ein Browser für automatische Konfiguration eingestellt ist, dann versucht er bei Programm-Start eine DHCPINFORM-Anfrage an den DHCP Server zu stellen. Ein passend konfigurierter DHCP-Server sendet in seiner Antwort die Proxy-Konfiguration.

Diese Methode erlaubt die bequeme zentrale Steuerung der Proxy-Konfiguration für alle Browser auf allen PC eines LAN.
Das DHCP-Protokoll ist speziell dafür ausgelegt, den DHCP-Server in einem anfangs völlig unbekannten Netzwerk zu finden (Broadcast-Anfragen).

DHCP-Konfiguration

Erzeugen sie im Arbeits-Verzeichnis des Webservers eine Kopie der Datei autoproxy.pac mit dem Namen wpad.dat. Auch andere Datei-Namen sind möglich, der vorgesehene Name wpad.dat funktioniert jedoch zuverlässig.
Der DHCP-Server muss zur Weitergabe dieser Information konfiguriert werden. Am Linux DHCP Server dhcpd erfolgt die Konfiguration durch diese oder eine ähnliche Text-Datei:
/etc/dhcpd.conf
Fügen sie z.B. diese Zeilen in die Text-Datei ein:
option wpad code 252 = text;
option wpad "http://192.168.0.1/wpad.dat";
Ersetzen sie die Adresse des Webservers (hier 192.168.0.1 ) durch die Daten ihres eigenen Webservers.

Wenn sie Sicherheits-Probleme mit der Text-Datei wpad.dat befürchten, dann können sie einen anderen Datei-Namen wählen.
Die Änderung tritt bei Neu-Start des DHCP-Servers in Kraft.

Web Proxy AutoDiscovery Protocol WPAD mit HTTP

WPAD mit DNS + Webserver

Diese Methode ist weniger empfehlenswert als mit DHCP ↑ , weil sie mehr Anforderungen stellt und weniger Sicherheit bietet.
Sie ist nur unter folgenden Bedingungern sinnvoll anwendbar:
Jeder PC des lokalen Netzwerks (LAN) ist Mitglied einer Domain.
Eigener Webserver, der die Domain betreut
Eigener Domain Name Server (DNS) innerhalb des LAN.

Die Konfigurations-Datei mit dem fixen Namen wpad.dat wird jedem Browser vom eigenen Webserver geliefert.
Diese Text-Datei ist genauso aufgebaut wie für ↑ AutoProxy-Dateien angegeben, d.h. sie enthält die Javascript-Funktion findProxyForURL

Ablauf

Jedes für vollautomatische Konfiguration eingestellte Browser-Programm versucht beim Start, eine Datei mit dem fixen Namen wpad.dat vom eigenen Webserver zu erhalten.

Da dessen Adresse zunächst nicht bekannt ist, versucht der Browser, den Server über den Domain-Namen zu erreichen.
Um den Domain-Namen in eine IP-Adresse zu übersetzen, wird ein Domain Name Server (DNS) befragt.

Wenn der DNS eine IP-Adresse liefert, dann wird die Browser-Anfrage dorthin geleitet.

Wenn an der angegebenen Adresse ein Webserver arbeitet, wenn dieser für WPAD konfiguriert ist, und wenn die Datei wpad.dat im Arbeits-Verzeichnis des Webservers vorliegt, dann wird sie an den Browser gesendet.

Mit den Angaben der Datei wird der Browser konfiguriert.

Problem:
Der Opera-Browser (zumindest manche Versionen) interpretiert eine Datei wpad.dat falsch. Für diesen Browser muss man einen Link auf eine Datei mit anderem Namen einsetzen, z.B. wpad.pac

http://www.wpad.com:
Hier landen die meisten fehlerhaft konfigurierten WPAD-Anfragen.
Interner Ablauf:
Wenn ein Browser eines PC der Domain mydom.com für automatische Proxy-Konfiguration eingestellt ist, dann stellt er zunächst diese Anfrage an den eingetragenen DNS-Server:
Protokoll = → UDP,
IP-Adresse = DNS-Adresse so wie am PC konfiguriert,
Port = 53 (Standard für DNS)
Text-Daten = wpad.mydom.com

Wenn keine Antwort eintrifft, wird die Anfrage evtl. an einen NetBIOS Nameserver wiederholt (dessen Adresse unbekannt sein kann):
Protokoll = UDP,
IP-Adresse = Broadcast-Adresse, z.B. 192.168.0.255
Port = 137 (Standard für NetBIOS Nameserver)

Nach Antwort eines DNS wird eine HTTP-Anfrage ähnlich dieser an den Webserver gesendet:
Protokoll = TCP
IP-Adresse = wie vom DNS erhalten
Port = 80 (Standard für HTTP)
Text-Daten =
GET /wpad.dat

Der Webserver antwortet bei korrekter Konfiguration mit → HTTP-Status 200 OK und sendet anschließend die Datei mit der Type application/x-ns-proxy-autoconfig
Ansonsten antwortet der Webserver mit einer Fehlermeldung (meist HTTP-Status 501 Not Implemented ).
Der eigene Domain Name Server (DNS) muss den Domain-Namen in die IP-Adresse des eigenen Webservers übersetzen. Das ist normalerweise gewährleistet.
Beispiel:
Jeder PC im LAN ist als Mitglied der Domain mydom.com konfiguriert. In diesem Fall richtet jedes Browser-Programm unmittelbar nach seinem Start eine Anfrage an die Adresse
http://wpad.mydom.com/wpad.dat
Wenn man keinen eigenen DNS betreibt, ist das Verfahren sinnlos, da man die gesuchten Daten (Proxy-Adresse) dazu verwenden müsste, um sie von einem externen DNS zu erhalten, den man nur über den Proxy-Server erreicht.
Der Webserver muss zur Verwendung von WPAD ausdrücklich konfiguriert werden, damit diese Datei mit der → MIME-Type application/x-ns-proxy-autoconfig ausgeliefert wird. Am → Apache Webserver wird z.B. dieser Text in die Konfigurations-Datei eingefügt:
AddType application/x-ns-proxy-autoconfig wpad.dat
Die Änderung tritt bei Neu-Start des Webservers in Kraft.
Sicherheits-Problem:
Die Methode erfordert, dass der korrekte Name der eigenen Domain an jedem PC eingetragen ist. Andere (fehlerhaft eingetragene) Namen kann der DNS nicht auflösen und reicht daher die DNS-Anfrage an andere DNS im Internet weiter. Deren Antwort ist unkontrollierbar und kann evtl. zu einem gefährlichen (manipulierten) Proxy führen.

Die Methode erfordert weiters, dass der eigene Domain Name Server DNS korrekt eingetragen wurde. Bei Änderung dieser Konfiguration wird evtl. ein anderer DNS befragt, was eine unkontrollierbare Antwort ergeben kann.

Der Pfad zur WPAD-Datei ist festgelegt und leicht auszuforschen. Das erleichtert den Zugang, um diese Datei evtl. zu manipulieren.

Wenn die Proxy-Adresse von einem Angreifer geändert wurde, dann ist es damit möglich, den gesamten Netzwerk-Verkehr aller betroffenen PC (im schlimmsten Fall aller PC des LAN) umzuleiten, abzuhören und zu manipulieren.

Umgebungs-Variable

Betriebssystem

Das Betriebssystem verwaltet einige 'Umgebungs-Daten', die jedem Programm zur Verfügung stehen. Man kann diese Daten jederzeit an einer Konsole ausgeben:

Auf Linux öffnen sie eine Shell-Konsole (Terminal) und geben ein:
# export
Auf Windows öffnen sie eine Konsole (Eingabeaufforderung, cmd.exe) und geben ein:
# set

Es gibt verschiedene Möglichkeiten, die Umgebungs-Variablen des Betriebssystems einzustellen, zu ändern oder zu ergänzen.

Konsultieren sie dazu geeignete Manuals oder suchen sie im Internet nach Kombinationen wie 'Linux Umgebung' oder 'Linux Environment' oder 'Windows Umgebung' oder 'Windows Systemvariablen'

Programme

Jedes Programm kann an die von ihm gestarteten (Child)-Programme weniger oder mehr Umgebungs-Variable weitergeben.
Ein wichtiges Beispiel ist das → Webserver-Programm, welches an seine Hilfs-(CGI)-Programme eine Reihe standardisierter Variablen weitergibt.
Details zu den Umgebungs-Daten von C/C++, Perl, PHP

Ein weiteres Beispiel ist der → Linux Cron-Server, welcher automatisch zu vor-programmierten Zeitpunkten Aufgaben ausführt:
Die von crond gestarteten Programme erhalten aus Sicherheits-Gründen nur ganz wenige Umgebungs-Daten.

Router-Variable

Leider sind die meisten Umgebungs-Variablen je nach Betriebssystem unterschiedlich. Es gibt nur wenige, die von jedem System gleich benannt und verwaltet werden. Dazu zählen die Router-Variablen.

Diese Variablen enthalten als Werte die Zugangs-Daten zum Router/Proxy-Server.
Für jedes Protokoll wird eine eigene Umgebungs-Variable definiert:
HTTP_PROXY, HTTPS_PROXY, FTP_PROXY
Eine eigene Variable definiert Adressen, welche direkt (ohne Proxy) erreihbar sind:
NO_PROXY

Die Definition der Router-Variablen ist optional: Man kann sie einrichten, man kann auch manche einrichten und andere weglassen.

Die Namen der Router-Variablen sind festgelegt, man kann sie jedoch klein oder groß schreiben, z.B.
HTTP_PROXY, http_proxy
Linux unterscheidet zwischen kleinen und großen Buchstaben, deshalb kann man beide Varianten definieren. Das ist empfehlenswert, da manche Programme evtl. nur nach einer der beiden Variablen suchen.
Man gibt nur einen einzigen Wert an und setzt diesen automatisch in die andere Variante jeder Router-Variablen ein:
export http_proxy=http://192.168.0.1:8080
export HTTP_PROXY=$http_proxy
Windows unterscheidet derzeit noch nicht zwischen den beiden Varianten.

Syntax

Die Grammatik (Syntax) der Router-Variablen ist festgelegt: Die Werte müssen dem URL-Schema entsprechen, d.h. sie müssen so aussehen wie eine typische Web-Adresse, allerdings immer mit ausdrücklicher Angabe des → Ports.

Beispiel:
http_proxy="http://192.168.0.1:8080"
gibt an, dass sich der Router an der IP-Adresse 192.168.0.1 befindet und dass er auf Port 8080 Aufträge annimmt.

Wenn ein Router die Anmeldung mit Name und Passwort verlangt, dann kann man diese in der Router-Variablen angeben, z.B.
http_proxy="http://ich:geheim@192.168.0.1:8080"
gibt für den gleichen Router den Namen ich und das Passwort geheim an.

Für die Variable no_proxy gelten andere Regeln: Als Wert kann man eine Liste von Namen und Adressen angeben, z.B.
no_proxy="localhost, 127.0.0.1, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16"
Dieses Beispiel funktioniert für alle lokalen Netzwerke. Wenn sie innerhalb des LAN einen Domain-Namen verwenden, dann sollten sie diesen ebenfalls in die Liste einfügen.

Anwendung

Wenn die Router-Variablen korrekt definiert wurden, dann kann (!) sich jedes beliebige Programm daran orientieren.

Das gilt nicht nur für Browser sondern für alle Programme, die Verbindung mit dem Internet aufnehmen wollen.

Es hängt vom jeweiligen Programm ab, ob und wie es diese Angaben nutzt. Viele modernen Programme versuchen ungefragt, die Router-Variablen zu lesen, andere muss man dazu konfigurieren, z.B. mit Einstellungen wie 'Router/Proxy-Daten des Betriebssystems verwenden'.

Tipp: Richten sie die Router-Variablen an allen Desktop-PC ein, die fix im eigenen LAN betrieben werden. Damit werden alle anderen auf dieser Seite angeführten AutoProxy-Methoden nicht ersetzt sondern ergänzt.

AutoProxy: URL-Bedingungen

Das erste an die Funktion FindProxyForURL übergebene Argument ist die vom Browser angeforderte Adresse (Browser-Adresszeile). Sie wird meist in einer Javascript-Variablen mit dem Namen url gespeichert und kann zur Steuerung von bedingten Verzweigungen verwendet werden.

Dienst

Diese Funktion weist den Client an, seine Anfragen je nach dem angeforderten Dienst (FTP, File, HTTP und alle anderen) 3 verschiedene Adressen zu leiten:
function FindProxyForURL(url,host) {
var urlow=url.toLowerCase();
var px="PROXY 192.168.0.1:8080;";
if(urlow.substring(0,4)=="ftp:") {
px="PROXY 192.168.0.11:8888;";
}
else if(urlow.substring(0,5)=="file:") {
px="DIRECT";
}
return px;
}
Meist ist es sinnvoll, das Argument url vor Verwendung in Klein-Buchstaben umzuwandeln. In diesem Fall kann man auf eine URL unabhängig von der Schreibweise planmäßig reagieren.

Das Beispiel weist den Browser an, für FTP-Anfragen den Proxy aud IP-Adresse 192.168.0.11 und Port 8080 zu verwenden, für File-Anfragen keinen Proxy (d.h. Datei-Suche am eigenen PC).

Server

Diese Funktion weist den Client an, Anfragen an den eigenen Server direkt zu stellen, alle anderen Anfragen an den angegebenen Proxy-Server:
function FindProxyForURL(url,host) {
var px="PROXY 192.168.0.1:8080;";
if(url.match(/MyServer/)) {
px="DIRECT";
}
return px;
}
Mit diesem Beispiel werden Anfragen an den eigenen Webserver (hier mit dem Namen MyServer) direkt adressiert und nicht über den Proxy geleitet.
Am besten verwendet man einen → Regulären Ausdruck zur Analyse des URL-Strings. Ersetzen sie MyServer durch den Namen ihres Webservers. Javascript kennt keine Namen von Servern, Domänen etc. IP-Adressen müssen daher zusätzlich programmiert werden. Sonderzeichen werden dabei mit \ maskiert, z.B.
if(url.match(/^http:\/\/192\.168\.0\.2\//)) {..}

Details zu Regulären Ausdrücken (RexExp)

An Stelle von Regulären Ausdrücken kann man auch die Funktion shExpMatch (Shell Expression Match) verwenden, die jedoch bedeutend weniger Möglichkeiten bietet.
In der Praxis sind viele Proxy-Server zu 'tolerant' eingestellt: Sie akzeptieren auch Anfragen an den eigenen LAN-Server und leiten sie im Netzwerk an diesen weiter.
Das hat zur Folge, dass alle Browser auch mit nachlässigen Einstellungen funktionieren: Da normalerweise die meisten Anfragen an den eigenen LAN-Server (Webserver) gerichtet sind, wird auf diese Weise der Verkehr (Traffic) im lokalen Netzwerk ohne irgendeinen Nutzen verdoppelt.
Tipp: Konfigurieren sie ihren Proxy-Server streng: Er soll alle Anfragen an den eigenen LAN-Server mit Fehler-Meldung ablehnen (Squid Proxy-Server sind normalerweise so konfiguriert).
Richten sie das Autoproxy-Programm so ein wie oben gezeigt, d.h. mit einer ausdrücklichen Ausnahme für den eigenen LAN-Server.
Belohnung: Alle Browser funktionieren einwandfrei, der Verkahr im LAN wird reduziert, der Proxy-Server entlastet, das gesamte Netzwerk funktioniert schneller - ohne irgendeine Investition.

AutoProxy: Host-Bedingungen

Die zweite an die Funktion FindProxyForURL übergebene Variable ist der aus der Browser-Adresszeile entnommene Host-Name, d.h. jener Text-Teil des ersten Arguments url, welcher sich zwischen :// und dem ersten danach folgenden / oder : befindet. Sie wird meist in der Javascript-Variablen host gespeichert und kann zur Steuerung von bedingten Verzweigungen verwendet werden.
Am häufigsten wird die Funktion isInNet eingesetzt. Sie überprüft, ob die IP-Adresse host innerhalb eines (des eigenen LAN)-Bereichs liegt. Der Bereich wird wie üblich durch eine Basis-Adresse und eine → Netzwerk-Maske definiert.
function FindProxyForURL(url,host) {
px="DIRECT";
if(isInNet(host,"192.168.0.0","255.255.255.0"))
{px="PROXY 192.168.0.1:8080";}
return px;
}
Dieses Beispiel weist den Browser an, ohne weitere Vereinbarung direkt mit dem Internet zu verbinden. Wenn sich die host-Adresse jedoch innerhalb des eigenen lokalen Netzwerks 192.168.0.0 bis 192.168.0.255 befindet, dann soll der angeführte Proxy verwendet werden.
Die Funktion isInNet führt eine → DNS-Anfrage durch. Sie führt zu einer langen Verzögerung, wenn der eingestellte DNS-Server nicht erreichbar ist (z.B. keine Internet-Verbindung).
Beispiele für andere Adress-Bereiche:
Dieses LAN ist in 2 gleich große Sub-Netze geteilt, die unterschiedlich konfiguriert werden können:
isInNet(host,"192.168.0.0","255.255.255.128")
trifft für alle IP-Adressen von 192.168.0.0 bis 192.168.0.127 zu.
isInNet(host,"192.168.0.128","255.255.255.128")
trifft für alle IP-Adressen von 192.168.0.128 bis 192.168.0.254 zu   (192.168.0.255 ist die Broadcast-Adresse und kann nicht vergeben werden).

Jedes 1-Bit der → Maske verlangt, dass das entsprechende Bit der Basis-Adresse gleich wie jenes der untersuchten IP-Adresse sein muss.
Jedes 0-Bit der Maske erlaubt beliebige Werte des entsprechenden Bits in der untersuchten IP-Adresse.

Logische Verknüpfung

In der Praxis werden meist mehrere Bedingungen miteinander verknüpft. Dazu werden die Javascript Operatoren ( && || ! ) verwendet (and, or, not).

Beispiel
if( isInNet(..) || isInNet(..) ) {...}
ODER-Verknüpfung von 2 Bedingungen
Funktion isPlainHostName() überprüft, ob der String host Punkte im Namen enthält:
if(isPlainHostName(host)) {...}

Funktion dnsDomainIs überprüft, ob ein host Teil einer namentlich angegebenen Domain ist:
if(dnsDomainIs(host,".mydomain.at")) {...}
Funktion dnsResolve übersetzt einen host-Namen in eine IP-Adresse. Die IP-Adresse kann anschließend weiter analysiert werden:
var hip=dnsResolve(host);
if(isInNet(hip,"10.0.31.0","255.255.255.128")) {...}
if(isInNet(hip,"10.0.31.128","255.255.255.128")) {...}
Die erste Bedingung trifft auf alle hosts 10.0.31.0 bis 10.0.31.127 zu, die zweite Bedingung auf alle hosts 10.0.31.128 bis 10.0.31.254

IPv6

Derzeit scheint es keine Standard-Funktion zur Unterscheidung von IPv4 und IPv6 Adressen zu geben.
Man kann dazu Text-Funktionen (am besten → Reguläre Ausdrücke) verwenden, denn IPv4-Adressen verwenden . Punkte, IPv6 Adressen verwenden : Doppelpunkte als Trennzeichen.

if(dnsResolve(host).match(/:/)) {
// IPv6
}

AutoProxy: Client-Bedingungen

Funktion myIpAddress() gibt die IP-Adresse des anfragenden PC zurück, d.h. jenes PC auf welchem der Browser läuft.
if(myIpAddress(host)=="192.168.0.12") {...}
Diese wichtige Funktion erlaubt die Einteilung aller anfragenden PC in Sub-Netzwerke und die Zuweisung der jeweils am besten geeigneten Gruppen-Proxy-Server.

Dieses Beispiel testet mit einem → Regulären Ausdruck die Zugehörigkeit zu einem Klasse C-Subnetz: eines Klasse A-LAN:
if(myIpAddress().match(/^10\.0\.75\./)) {...}
Die Bedingung trifft auf alle Client-PC mit Adressen 10.0.75.0 bis 10.0.75.255 zu.
Dieses Beispiel verwendet die Client IP-Adresse in Kombination mit der Funktion isInNet()
var clip=myIpAddress();
if(isInNet(clip,"10.0.75.0","255.255.255.128")) {...}
if(isInNet(clip,"10.0.75.128","255.255.255.128")) {...}
Die erste Bedingung trifft auf eine Teil-Gruppe zu, alle PC mit Adressen von 10.0.75.0 bis 10.0.75.127
Die zweite Bedingung trifft auf die andere Teil-Gruppe zu, alle PC mit Adressen von 10.0.75.128 bis 10.0.75.254

AutoProxy: Rückgabe-Wert

Die Funktion findProxyForURL() sollte einen String zurückgeben.
Mögliche Werte:

"DIRECT" bedeutet, dass der betreffende PC selbst die Verbindung mit dem Internet aufnehmen soll, d.h. ohne Proxy (wenn das technisch möglich ist).
Beispiel:
return "DIRECT";

"PROXY IP:Port" fordert dazu auf, den Proxy mit den angegebenen Daten von IP-Adresse und Port zu benutzen.
(IP und Port sind durch die realen Werte zu ersetzen).
Beispiel:
return "PROXY 192.168.0.1:8080";
"SOCKS IP:Port" fordert zur Verwendung des angegebenen SOCKS-Proxy auf. Allerdings wird diese Variante nur mehr selten verwendet.

Kombinationen mehrerer Einstellungen, durch ; getrennt. Die einzelnen Konfigurationen werden in der angeführten Reihenfolge versucht. Wenn die erste Konfiguration versagt, wird die nächste probiert, usw.
Das ist die bevorzugte Variante für größere Netzwerke, die mehrere technische Möglichkeiten des Internet-Zugangs haben. Damit wird z.B. ein lokaler Proxy der jeweiligen Subnetz-Gruppe bevorzugt verwendet. Wenn dieser ausfällt, wird automatisch der Proxy der benachbarten Gruppe verwendet, usw.
Beispiel:
var px="PROXY 192.168.0.1";
if(..) {px+="; PROXY 192.168.0.11:8888";}
if(..) {px+="; DIRECT";}
. . .
return px;

AutoProxy: Keine interaktiven Funktionen

Für Javascript AutoProxy-Funktionen gelten eigene Regeln:
Alle interaktiven Javascript-Funktionen ergeben Fehler.
Die Reaktion ist je nach Browser und Version unterschiedlich: Meist wird das Script trotzdem weiter ausgeführt, manchmal auch abgebrochen.
Normalerweise erfolgt keine Fehlermeldung. Browser mit Javascript-Konsole zeichnen dort jedoch eine Meldung auf.
Davon sind z.B. folgende Javascript-Funktionen betroffen:
alert(), confirm(), open(), print(), prompt() ...
Aus diesem Grund ist es sehr schwierig, AutoProxy Scripts zu debuggen.
Provisorium: Man kann eine Kopie des Scripts in einer eigenen Webseite testen.

Umgekehrt sind in 'gewöhnlichen' Javacsript-Programmen die speziellen AutoProxy-Funktionen (isInNet(), isPlainHostName(), dnsDomainInIs(), ..) nicht verwendbar.

AutoProxy mit Server-Programmiersprachen

Fast alle → Webserver arbeiten mit Hilfs-Programmen zusammen, typisch mit Programmen der Programmiersprachen Java, Perl, PHP, Python... Die AutoProxy-Methoden können dabei auf 2 unterschiedliche Arten genutzt werden:
Wenn die (Hilfs)-Programme Verbindung mit dem Internet aufnehmen wollen, dann brauchen sie dazu die Zugangs-Daten.
Es ist möglich, die AutoProxy-Datei nicht statisch (als Text-Datei) anzulegen, sondern Live nach Bedarf mit (Hilfs)-Programmen zu erzeugen.

Zugang zum Router

Wenn ein (Perl, PHP, ...) Programm Verbindung mit dem Internet aufnehmen soll, dann bezieht man die Router-Daten meist aus dem → Umgebungs-Variablen - wenn diese korrekt definiert wurden.
Diese Daten werden vom Webserver normalerweise nicht weitergegeben. MitPassEnv-Anweisungen kann man das in der Konfiguration des Webservers ändern:
<IfModule mod_env.c>
PassEnv HTTP_PROXY
PassEnv HTTPS_PROXY
PassEnv FTP_PROXY
PassEnv NO_PROXY
</IfModule>

Wenn die Router-Daten nicht definiert wurden, dann kann man sie in der Konfiguration des Webservers ergänzen, z.B. mit
<IfModule mod_env.c>
SetEnv HTTP_PROXY http://192.168.0.1:8080
</IfModule>

Je nach Konfiguration von PHP kann man dann die Router-Daten aus einem oder beiden angeführten Globalen Arrays lesen:
$prx=$_SENV['HTTP_PROXY'];
$prx=$_SERVER['HTTP_PROXY'];
Diese Angaben gelten sinngemäß auch für alle anderen Server-Programmiersprachen.

Eine weitere Möglichkeit besteht darin, die AutoProxy-Datei selbst vom eigenen Webserver anzufordern oder die Datei direkt zu lesen. Damit garantiert man, dass eine allfällige Änderung der Daten ohne weitere Maßnahmen auch an eigene Server-Programme weitergegeben wird.
Zum Lesen von Webseiten mit PHP muss die Konfigurations-Variable allow_url_fopen eingeschaltet sein.

Vereinfachtes Beispiel (PHP):
$url = 'http://localhost/autoproxy.pac';
ini_set('allow_url_fopen','On');
$fh = fopen($url,'r');
while(!feof($fh)){
$line = fgets($fh,1000);
print htmlentities($line)."$h<br />\n";
}
fclose($fh);
In diesem Fall kann man die Zeile mit den Router-Daten ausfiltern, und mit den Daten eine Verbindung mit einem (im Internet) entfernten Server aufnehmen.

Live-Erzeugung der AutoProxy-Datei

Die Kapitel dieser Seite zeigen einige Möglichkeiten, um das AutoProxy-Verhalten mit → Javascript zu programmieren.

Alternativ kann man auf Javascript und auf eine statische Text-Datei ganz verzichten und auf die AutoProxy-Anfragen mit typischen Webserver-Hilfsprogrammen antworten. In diesem Fall sind der Programmierung praktisch keine Grenzen gesetzt.
Client-Daten
Alle modernen Server-Programmiersprachen verfügen über wichtige Daten der BesucherInnen (Clients), z.B. IP-Adressen und Browser-Programme.
Details zu den Umgebungs-Daten von C/C++, Perl, PHP


Beispiel (PHP):
$client_ip = $_SERVER['REMOTE_ADDR'];
$client_browser = $_SERVER['HTTP_USER_AGENT'];

Um aus diesen Daten Informationen zu entnehmen, werden sie meist mit → Regulären Ausdrücken (RegExp) untersucht.

Aus diesen und beliebigen anderen Daten kann das Server-Programm die jeweils erwünschten Router-Daten ableiten und dem anfragenden Client (Browser) mitteilen.

MIME-Type

Wenn man eine AutoProxy-Datei Live erzeugt, dann kann der Webserver die → MIME-Type normalerweise nicht bestimmen. Daher muss man die korrekte MIME-Type selbst im → HTTP-Header angeben.

Diese Angabe muss vor der Ausgabe von Text erfolgen, d.h. meist als erste Programm-Zeile, z.B. (PHP):
header('Content-type: application/x-ns-proxy-autoconfig');

Ausgabe-Text

Wenn man die AutoProxy-Datei Live erzeugt, dann genügt es, eine einzige Jvavascript Programm-Zeile auszugeben.
Die Anweisung (z.B. des PHP-Programms) lautet in diesem Fall z.B.
print "px=\"PROXY 192.168.0.1:8080\";\n";

Der Webserver sendet den Live erzeugten Text an den Client (Browser), welcher ihn als Javascript Programm interpretiert, z.B.
px="PROXY 192.168.0.1:8080";