Geckozone est un Club Unesco

Configuration automatique du proxy

Profil(s) : Confirmé Webmestre
Date : 27 décembre 2004
Auteur : Alain B

La configuration proxy du navigateur peut être automatisée et rendue transparente pour les utilisateurs. Elle nécessite simplement de la part des administrateurs de réseaux la création d’un fichier spécifique de configuration.

- Article d’inspiration libre à partir du site netscape proxy live [1]
- Attention, cet article nécessite un prérequis sur la notion de serveur mandataire (appelé proxy ci-après) et de la programmation javascript.

Au sein de réseaux d’entreprise, il arrive souvent qu’un navigateur doive être configuré pour accéder à Internet ou à des Intranets en passant par un serveur proxy. Les administrateurs savent ensuite combien il est fastidieux lors d’un changement des paramètres proxy de devoir modifier tous les postes de travail ou d’informer les utilisateurs souvent novices. De même, en cas de panne du serveur proxy, il est souvent nécessaire de revenir en accès direct à Internet, au risque d’oublier ensuite de remettre la configuration proxy.

Depuis Netscape 2.0, vous pouvez créer un fichier de configuration automatique de proxy. Vous devrez simplement indiquer l’adresse URL vers ce fichier dans les options de configuration du navigateur.

PNG - 39.5 ko
Configuration proxy

Cette adresse est celle d’un unique fichier de configuration en javascript (généralement avec une extension .pac) qui lui même contient une unique fonction FindProxyForURL().

function FindProxyForURL(url, host) {
...
}

url est l’adresse complète du site à accéder transmis par le navigateur et host est l’extraction simple du domaine de cette adresse.

Note : Une précision est nécessaire car ce fichier, situé sur un serveur local ou distant, doit être délivré avec le type mime [2] application/x-ns-proxy-autoconfig. Sous Apache, il est simple d’ajouter ce type par une ligne AddType dans le fichier de configuration : AddType application/x-ns-proxy-autoconfig .pac

La fonction doit retourner une valeur au navigateur indiquant quelle configuration proxy utiliser. Cette valeur est une simple chaîne de caractères pouvant contenir un ou plusieurs des blocs d’informations suivants, séparés par des points virgules :

DIRECT connexion directe à internet, sans proxy
PROXY host:port connexion via le proxy spécifié
SOCKS host:port connexion via un serveur SOCKS

Note : Notez que si vous spécifiez plusieurs blocs, en cas d’échec de la première connexion correspondant au premier bloc, la seconde connexion correspondant au second bloc sera utilisée, et ainsi de suite. A l’inverse, si la fonction ne renvoie rien ou une chaîne vide, une connexion directe sera utilisée.

Par exemple, la fonction peut contenir une ligne return "PROXY w3proxy.mondomaine.com:8080; PROXY mozilla.mondomaine.com:8081; DIRECT";.

Il vous suffit donc d’écrire un script en langage javascript qui n’aura d’autre tâche que de retourner une des trois valeurs mentionnées dans le tableau précédent. Votre script se résumera en général à une série de tests sur l’adresse url ou l’hôte host transmis. Vous bénéficiez des fonctions habituelles de javascript, telles que le traitement des chaînes de caractères, et quelques-unes spécifiques, décrites ci-dessous.

Exemple 1 :

Le proxy ne sera pas utilisé pour les adresses en nom local et celles du sous domaine .mondomaine.com. Toutes les autres adresses utilisent le proxy. Vous noterez qu’en cas de défaillance du serveur proxy, une connexion directe sera utilisée.

function FindProxyForURL(url, host)
 {
   if (isPlainHostName(host) ||
       dnsDomainIs(host, ".mondomaine.com"))
     return "DIRECT";
   else
     return "PROXY w3proxy.mondomaine.com:8080; DIRECT";
 }

Exemple 2 :

Ici, quatre serveurs proxy sont utilisés. Le premier pour les accès vers les domaines .com, le second vers les accès vers les domaines .edu, le troisième pour tous les autres domaines et le quatrième étant en secours. Les adresses locales ou du sous-domaine .mondomaine.com sont traitées en connexion directe.

function FindProxyForURL(url, host)
 {
   if (isPlainHostName(host) || dnsDomainIs(host, ".mondomaine.com"))
     return "DIRECT";
   else if (shExpMatch(host, "*.com"))
     return "PROXY proxy1.mondomaine.com:8080; " +
            "PROXY proxy4.mondomaine.com:8080";
   else if (shExpMatch(host, "*.edu"))
     return "PROXY proxy2.mondomaine.com:8080; " +
            "PROXY proxy4.mondomaine.com:8080";
   else
     return "PROXY proxy3.mondomaine.com:8080; " +
            "PROXY proxy4.mondomaine.com:8080";
 }

Exemple 3 :

Dans cet exemple, la configuration proxy renvoyée dépendra du protocole employé. A noter que la fonction shExpMatch(url, "http:*") aurait pu remplacer le code url.substring(0, 5) == "http:".

function FindProxyForURL(url, host)
 {
   if (url.substring(0, 5) == "http:") {
       return "PROXY http-proxy.mondomaine.com:8080";
     }
   else if (url.substring(0, 4) == "ftp:") {
       return "PROXY ftp-proxy.mondomaine.com:8080";
     }
   else if (url.substring(0, 7) == "gopher:") {
       return "PROXY gopher-proxy.mondomaine.com:8080";
     }
   else if (url.substring(0, 6) == "https:" ||
            url.substring(0, 6) == "snews:") {
       return "PROXY security-proxy.mondomaine.com:8080";
     }
   else {
       return "DIRECT";
     }
 }

Les différentes fonctions prédéfinies utilisables

Pour traiter l’adresse url transmise par le navigateur, vous disposez de fonctions prédéfinies qui vous serviront au travers de tests dans votre script.

  • Tests sur le nom de domaine :
    • isPlainHostName()
    • dnsDomainIs()
    • localHostOrDomainIs()
    • isResolvable()
    • isInNet()
  • Fonctions associées :
    • dnsResolve()
    • myIpAddress()
    • dnsDomainLevels()
  • Tests sur l’URL ou le nom de domaine :
    • shExpMatch()
  • Tests temporels :
    • weekdayRange()
    • dateRange()
    • timeRange()

Dans la majorité des cas, les fonctions retournent une valeur booléenne true ou false, respectivement vrai ou faux.


Détail des fonctions disponibles pour la configuration automatique du proxy

isPlainHostName(host)

renvoie true s’il n’y a pas de nom de domaine dans host (ex : "www"), et false si host contient des points (ex. : "www.mozilla.org").

dnsDomainIs(host, domain)

renvoie true si domain est un sous domaine de host.
- dnsDomainIs("www.mozilla.org", ".mozilla.org") renvoie true
- dnsDomainIs("www", ".mozilla.org") renvoie false

localHostOrDomainIs(host, hostdom)

renvoie true s’il n’y a pas de nom de domaine dans host ou si host correspond exactement à hostdom.
- localHostOrDomainIs("www.mozilla.org", "www.mozilla.org") renvoie true
- localHostOrDomainIs("www", "www.mozilla.org") renvoie true

isResolvable(host)

renvoie true si le serveur host est accessible.

isInNet(host, pattern, mask)

renvoie true si l’adresse IP de l’hôte host dont les valeurs masquées de façon binaire par les valeurs de mask correspond au schéma pattern.
- isInNet(host, "198.95.0.0", "255.255.0.0") renvoie true si l’adresse IP de host est égale à "198.95.*.*"

dnsResolve(host)

renvoie l’adresse IP de l’hôte host sous la forme d’une chaîne de caractères séparés par des points.
- dnsResolve("www.mozilla.org") renvoie "193.252.19.3"

myIpAddress()

renvoie l’adresse IP utilisée par le navigateur sous la forme d’une chaîne de caractères séparés par des points.

dnsDomainLevels(host)

renvoie le nombre de niveau de domaine dans le nom d’hôte host (en fait, le nombre de point dans host).
- dnsDomainLevels("www.mozilla.org") renvoie 2

shExpMatch(str, shexp)

renvoie true si la chaîne str, pouvant être un lien URL, correspond au critère shexp exprimé sous forme d’un filtre en ligne de commande, et non en une expression régulière.
- shExpMatch("http://www.mozilla.org/products/firefox/index.html", "*/products/*") renvoie true

weekdayRange(wd1, wd2, gmt)

renvoie true si le jour actuel de la semaine (local ou GMT) est inclus dans la plage définit par wd1 et wd2. wd1 et wd2 prennent les valeurs SUN, MON, TUE, WED, THU, FRI ou SAT (où SUN=dimanche, MON=lundi, etc.), et gmt est vide pour le temps local ou prend la valeur "GMT" pour le temps calculé sur le méridien de Greenwich.
- weekdayRange("MON", "FRI") renvoie true du lundi au vendredi.
- weekdayRange("SAT") renvoie true le samedi

dateRange(day1, month1, year1, day2, month2, year2, gmt)

renvoie true si le jour actuel (local ou GMT) est inclus dans une plage temporelle. Les mois sont les chaînes de caractères JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV ou DEC (ou JAN=janvier, etc.).
- dateRange(1) renvoie true les premiers jours de chaque mois
- dateRange(1, 15) renvoie true du 1 au 15 de chaque mois
- dateRange(1, "JAN", 15, "MAR") renvoie true du 1er janvier au 15 mars de chaque année
- dateRange(1999, 2002) renvoie true de l’année 1999 (et non 99 !) à 2002

timeRange(hour1, min1, sec1, hour2, min2, sec2, gmt)

renvoie true si l’appel se fait dans la plage temporelle définie.
- timerange(12) renvoie true de midi à 13 heures
- timerange(8, 30, 17, 00) renvoie true de 8h30 à 17h00

[1] Cet article documentaire issu du site Netscape date de mars 1996

[2] Type MIME : Multipurpose Internet Mail Extensions

Articles dans la même rubrique

Commentaires

(Si vous recherchez de l'aide pour l'utilisation d'un produit, veuillez utiliser les forums de Geckozone. Les commentaires concernent uniquement l'article. Merci.)

Afficher les commentaires (2) Ajouter un commentaire

Un message, un commentaire ?

(Pour créer des paragraphes, laissez simplement des lignes vides.)

Lien hypertexte (optionnel)

(Si votre message se réfère à un article publié sur le Web, ou à une page fournissant plus d'informations, vous pouvez indiquer ci-après le titre de la page et son adresse.)

Qui êtes-vous ? (optionnel)