| |
| Sun Java System Web Proxy Server 4 .0.1 관리 설명서 | |
17 장
클라이언트 자동 구성 파일 사용많은 수의 클라이언트를 지원하는 여러 프록시 서버가 있는 경우 클라이언트 자동 구성 파일을 사용하여 모든 브라우저 클라이언트를 구성할 수 있습니다. 자동 구성 파일에는 브라우저가 다양한 URL을 액세스하는 데 사용할 프록시를 결정하는 JavaScript 함수가 포함되어 있습니다.
브라우저는 시작될 때 자동 구성 파일을 로드합니다. 사용자가 링크를 누르거나 URL을 입력할 때마다 브라우저는 이 구성 파일을 이용하여 프록시를 사용할지, 또 사용한다면 어떤 프록시를 사용할지 결정합니다. 이 기능을 사용하여 조직 내 브라우저의 모든 인스턴스를 쉽게 구성할 수 있습니다. 자동 구성 파일을 클라이언트에 가져오는 방법은 여러 가지가 있습니다.
- 자동 구성 파일을 반환하는 웹 서버로 프록시 서버를 사용할 수 있습니다. 브라우저를 프록시의 URL로 향하도록 합니다. 프록시가 웹 서버 역할을 하도록 하면 자동 구성 파일을 한 지점에 둘 수 있기 때문에 업데이트가 필요한 경우 한 파일만 변경하면 됩니다.
- 파일을 웹 서버, FTP 서버 또는 브라우저가 액세스할 수 있는 네트워크 디렉토리에 저장할 수 있습니다. 파일의 URL을 제공하여 브라우저가 해당 파일을 찾도록 구성하면 일반적인 URL의 경우 이와 같이 동작합니다. 복잡한 계산을 해야 하는 경우에는(예: 조직에 대규모 프록시 체인이 있는 경우) 파일에 액세스하는 사용자에 따라 다른 파일을 출력하는 웹 서버 CGI 프로그램을 만듭니다.
- 자동 구성 파일을 각 브라우저의 사본과 함께 로컬에 저장할 수 있습니다. 그러나 이 경우 파일을 업데이트할 때 파일의 복사본을 각 클라이언트로 배포해야 합니다.
자동 구성 파일을 만드는 방법은 Server Manager의 페이지를 사용하거나 파일을 직접 만드는 두 가지 방법이 있습니다. 파일을 만드는 방법은 이 장의 뒷부분에서 설명합니다.
이 장은 다음 내용으로 구성되어 있습니다.
자동 구성 파일 이해Proxy Server 관리자는 클라이언트 자동 구성 파일을 만들어 클라이언트에 배포할 가능성이 크기 때문에 이를 위해 이 설명서에서 자동 구성 파일 기능에 대해 설명합니다.
자동 구성 파일의 기능
자동 구성 파일은 클라이언트 및 서버 인터넷 응용 프로그램 개발용 객체 지향 스크립트 언어인 JavaScript로 작성됩니다. 브라우저는 JavaScript 파일을 해석합니다.
브라우저는 처음 로드될 때 자동 구성 파일을 다운로드합니다. 파일을 저장할 위치는 브라우저가 URL을 사용하여 가져올 수 있는 곳이면 됩니다. 예를 들어 파일을 웹 서버에 둘 수 있습니다. 또한 브라우저가 file:// URL을 사용하여 가져올 수 있다면 네트워크 파일 시스템에 파일을 저장할 수도 있습니다.
프록시 구성 파일은 JavaScript로 작성됩니다. JavaScript 파일은 브라우저가 각 URL에 대해 사용해야 하는 프록시 서버를 결정하는 하나의 함수(FindProxyForURL)를 정의합니다. 브라우저에서는 이 JavaScript 함수에 두 개의 매개 변수로 브라우저가 실행되는 시스템의 호스트 이름과 브라우저가 얻으려는 URL을 전송합니다. JavaScript 함수는 브라우저에 값을 반환하여 진행 방법을 알려줍니다.
자동 구성 파일을 사용하면 다양한 URL 형식, 다양한 서버, 심지어 다양한 하루 중 시간에 대해서까지 서로 다른 프록시를 지정하거나 또는 프록시를 지정하지 않을 수 있습니다. 즉, 여러 대의 프록시를 예를 들어 한 서버는 .com 도메인, 다른 서버는 .edu 도메인, 나머지 서버는 다른 도메인 전문 서버로 사용할 수 있습니다. 이 방법을 사용하면 여러 프록시가 모두 동일한 문서를 저장하지 않고 모든 파일의 복사본이 캐시에 한 개만 저장되므로 로드를 분산할 수 있고 프록시의 디스크를 더 효율적으로 사용할 수 있습니다.
또한 자동 구성 파일은 프록시 장애 복구를 지원하므로 한 프록시 서버를 사용할 수 없게 되면 브라우저는 다른 프록시 서버로 투명하게 전환합니다.
프록시를 웹 서버로 액세스
프록시 서버에 하나 이상의 자동 구성 파일을 저장하고 프록시 서버가 문서만 자동 구성 파일인 웹 서버 역할을 하도록 할 수 있습니다. 프록시 관리자는 이 방법을 사용하여 조직 내의 클라이언트에 필요한 프록시 자동 구성 파일을 유지 보수할 수 있습니다. 또한 중앙 위치에 파일을 보관하기 때문에 파일을 업데이트할 때 한 번만 해주면 모든 브라우저 클라이언트가 자동으로 이 업데이트를 적용합니다.
프록시 자동 구성 파일은 server- root/proxy-serverid/pac/ 디렉토리에 보관합니다. 브라우저에서 프록시 자동 구성 파일에 대한 URL을 입력하려면 Proxies 탭에서 파일에 대한 URL을 입력합니다. 프록시에 대한 URL의 형식은 다음과 같습니다.
http://proxy.domain:port/URI
예를 들어 URL은 http://proxy.example.com일 수 있습니다. URI(URL에서 호스트:포트 조합의 뒤에 나오는 부분)는 지정할 필요 없습니다. URI를 사용하는 경우에는 템플릿을 사용하여 다양한 자동 구성 파일에 대한 액세스를 제어할 수 있습니다. 예를 들어 /proxy.pac이라는 자동 구성 파일을 포함하는 /test라는 URI를 만든 경우 http://proxy.mysite.com:8080/test/.* 리소스 패턴으로 템플릿을 만들 수 있습니다. 그 다음 이 템플릿을 사용하여 해당 디렉토리에 특정한 액세스 제어를 설정할 수 있습니다.
여러 개의 자동 구성 파일을 만들어 서로 다른 URL을 통해 액세스하도록 할 수 있습니다. 표 17-1은 URI와 클라이언트에서 자동 구성 파일에 액세스하는 데 사용하는 URL의 예를 보여 줍니다.
표 17-1
URI 예 및 해당 URLURI(경로)
프록시에 대한 URL
/
http://proxy.mysite.com
/employees
http://proxy.mysite.com/employees
/group1
http://proxy.mysite.com/group1
/managers
http://proxy.mysite.com/managers
역방향 프록시에서 Pac 파일 사용
역방향 프록시의 동작 방식으로 인해 프록시 서버가 역방향 프록시 역할을 하면서 .pac 파일을 서비스하기는 매우 어려울 수 있습니다. 이는 프록시 서버가 파일에 대한 요청을 받고 이 요청이 로컬 .pac 파일에 대한 것인지 원격 문서에 대한 것인지 판단해야 하기 때문입니다.
프록시 서버가 .pac 파일 유지 보수 및 서비스에 더하여 역방향 프록시 역할을 하도록 설정하려면 obj.conf 파일을 직접 편집하여 NameTrans 함수의 순서를 올바르게 해야 합니다.
프록시 서버가 역방향 프록시 역할을 하도록 하려면 정규 매핑을 만듭니다. 이 방법은 일반적으로 프록시가 모든 요청을 원격 컨텐트 서버로 라우팅하도록 합니다. 프록시 자동 구성 파일을 /pac와 같은 특정 디렉토리에 추가하고 매핑할 수 있습니다. 이 경우 .pac 파일을 가져오는 모든 클라이언트는 다음과 같은 URL을 사용하게 됩니다.
http://proxy.mysite.com/pac
obj.conf 파일을 편집하여 프록시 자동 구성 파일에 대한 지시문과 함수가 다른 매핑에 앞서 가장 먼저 표시되도록 합니다. 프록시 서버는 보통 요청을 서비스하기 전에 모든 NameTrans 함수를 통하여 실행되므로 이 지시문과 함수가 가장 먼저 와야 합니다. 하지만 자동 구성 파일을 사용하면 프록시는 즉시 경로를 인식하고 .pac 파일을 반환합니다.
다음은 역방향 프록시를 사용하고 자동 구성 파일을 유지 보수하는 obj.conf 파일이 있는 경우의 예입니다.
<Object name="default">
NameTrans from="file:" fn="map" to="ftp:"
NameTrans from="/pac" fn="pac-map" name="file" to="/ns-home/proxy/pac/proxy.pac"
NameTrans fn="redirect" from="http://foo.*" url="http://www.acme.com"
NameTrans from="/ns-icons" fn="pfx2dir" dir="/ns-home/ns-icons" name="file"
NameTrans fn="reverse-map" from="http://web.acme.com" to="http://proxy.acme.com:8080"
NameTrans fn="map" from="http://proxy.acme.com:8080" to="http://web.acme.com"
NameTrans fn="map" from="/" to="http://web.acme.com"
PathCheck fn="url-check"
Service fn="deny-service"
AddLog fn="flex-log" name="access"
AddLog fn="urldb-record"
</Object>
Server Manager 페이지를 사용하여 자동 구성 파일 생성Server Manager 페이지를 사용하여 자동 구성 파일을 생성하려면 다음을 수행합니다.
- Server Manager에 액세스하고 Routing 탭을 선택합니다.
- Create / Edit Autoconfiguration File 링크를 누릅니다. 프록시 시스템에 있는 모든 자동 구성 파일의 목록이 있는 페이지가 표시됩니다. 자동 구성 파일을 클릭하면 편집할 수 있습니다. 나머지 단계는 새 파일을 만드는 방법을 설명합니다.
- URL의 경로 부분인 URI를 입력하면(선택 사항) 클라이언트가 프록시에서 자동 구성 파일을 가져올 때 사용할 수 있습니다. 예를 들어 슬래시(/)를 입력하면 클라이언트가 해당 파일을 프록시의 기본 문서로 액세스합니다(웹 서버의 index.html 파일과 유사). 이렇게 하면 클라이언트는 도메인 이름만 사용하여 이 자동 구성 파일에 대한 프록시에 액세스합니다. 여러 개의 URI를 사용할 수 있으며 각 URI에 대해 별도의 자동 구성 파일을 만들 수 있습니다.
- .pac 확장자를 사용하는 자동 구성 파일의 이름을 입력합니다. 파일이 하나인 경우에는 간단히 proxy.pac이라는 이름을 사용할 수 있습니다(pac: proxy autoconfiguration의 약자). 모든 자동 구성 파일은 하나의 JavaScript 함수가 있는 ASCII 텍스트 파일입니다.
- OK를 누릅니다. 다른 페이지가 표시됩니다. 자동 구성 파일을 만들려면 이 페이지를 사용하십시오. 페이지에 표시되는 항목의 순서는 클라이언트에 따라 달라집니다. 페이지에 표시되는 항목은 다음과 같습니다.
- Never Go Direct To Remote Server는 Navigator가 항상 프록시를 사용하도록 합니다. 프록시 서버가 실행 중이 아닌 경우에 사용할 보조 프록시 서버를 지정할 수 있습니다.
- Go Direct To Remote Server When은 특정한 경우 프록시 서버를 우회하도록 합니다. Navigator는 페이지에 나열되는 다음 옵션에 따라 이러한 특정한 경우를 결정합니다.
- Connecting To Non-fully Qualified Host Names는 사용자가 해당 컴퓨터 이름만 지정한 경우 Navigator가 서버로 직접 이동하도록 합니다. 예를 들어 winternal.mysite.com이라는 내부 웹 서버가 있는 경우 사용자는 정규화된 도메인을 입력하는 대신 http://winternal만 입력할 수 있습니다. 이 경우 Navigator는 프록시를 거치지 않고 해당 웹 서버로 직접 이동합니다.
- Connecting To A Host In Domain은 Navigator가 직접 액세스할 수 있는 도메인 이름을 최대 3개까지 지정합니다. 도메인 이름을 지정하는 경우 점(.)으로 시작해야 합니다. 예를 들어 .example.com과 같이 입력합니다.
- Connecting To A Resolvable Host는 클라이언트가 호스트를 확인할 수 있는 경우 Navigator가 해당 서버로 직접 이동하도록 합니다. 일반적으로 이 옵션은 DNS가 로컬(내부) 호스트만 확인하도록 설정된 경우 사용됩니다. 클라이언트는 로컬 네트워크 외부의 서버로 연결하는 경우에는 Proxy Server를 사용하게 됩니다.
- Connecting To A Host In Subnet은 클라이언트가 특정 서브넷에서 서버에 액세스하는 경우 Navigator가 서버로 직접 이동하도록 합니다. 이 옵션은 지역적으로 많은 서브넷이 있는 기업에게 유용합니다. 예를 들어 일부 기업은 전세계 특정 지역에 대한 각 서브넷에 하나의 도메인 이름을 적용할 수 있습니다.
- Except When Connecting To Hosts는 서버로 직접 이동하는 규칙에 예외를 지정합니다. 예를 들어 .example.com을 직접 이동할 도메인으로 입력한 경우 home.example.com은 예외로 지정할 수 있습니다. 이렇게 하면 Navigator는 home.example.com으로 이동하는 경우에는 프록시를 사용하며, 그 외 example.com 도메인에 있는 모든 서버로는 직접 이동하게 됩니다.
- Secondary Failover Proxy는 프록시 서버가 실행 중이 아닌 경우에 사용할 보조 프록시를 지정합니다.
- Failover Direct는 프록시 서버가 실행 중이 아닌 경우 Navigator가 서버로 직접 이동하도록 합니다. 보조 장애 복구 프록시를 지정하면 Navigator는 서버로 직접 이동하기 전에 이 보조 Proxy Server를 확인합니다.
- OK를 눌러 자동 구성 파일을 생성합니다. 이 파일은 server-root/proxy-serverid/pac 디렉토리에 저장됩니다. 파일이 올바르게 만들어졌다는 확인 메시지가 나타납니다. 이 단계를 반복하여 필요한 수 만큼 자동 구성 파일을 만듭니다.
자동 구성 파일을 만든 다음에는 모든 프록시 서버 사용자들에게 자동 구성 파일을 올바르게 가리키도록 하거나 또는 직접 Navigator 사본을 구성하십시오.
자동 구성 파일 직접 만들기이 절에서는 자동 구성 파일을 직접 만드는 방법에 대해 설명합니다.
프록시 자동 구성 파일은 클라이언트측 JavaScript를 사용하여 작성됩니다. 각 파일은 FindProxyForURL이라는 하나의 JavaScript 함수를 포함하고 있으며 이 함수는 브라우저가 각 URL에 대해 사용해야 하는 프록시 서버를 결정합니다. 브라우저에서는 이 JavaScript 함수에 두 개의 매개 변수로 대상 원본 서버의 호스트 이름과 브라우저가 얻으려는 URL을 전송합니다. JavaScript 함수는 Navigator에 값을 반환하여 진행 방법을 알려줍니다. 다음 절에서는 함수 구문과 가능한 반환 값에 대해 설명합니다.
FindProxyForURL 함수
FindProxyFor URL 함수의 구문은 다음과 같습니다.
function FindProxyForURL(url, host)
{
...
}브라우저는 액세스하는 모든 URL에 대해 url과 host 매개 변수를 전송하고 다음 방법으로 함수를 호출합니다.
ret = FindProxyForURL(url, host);
url은 브라우저가 액세스하는 전체 URL입니다.
host는 액세스되는 URL에서 추출한 호스트 이름입니다. 호스트 이름은 단지 편의를 위한 것으로, :// 와 첫 : 사이의 문자열 또는 ://와 / 사이의 문자열과 같습니다. 포트 번호는 이 매개 변수에 포함되지 않습니다. 필요한 경우 URL에서 추출할 수 있습니다.
ret(반환 값)는 구성을 설명하는 문자열입니다.
함수 반환 값
자동 구성 파일은 FindProxyForURL 함수를 포함합니다. 이 함수는 클라이언트 호스트 이름과 해당 클라이언트가 액세스하는 URL을 매개 변수로 사용합니다. 이 함수는 브라우저에 진행 방법을 알려주는 하나의 문자열을 반환합니다. 문자열이 Null인 경우 프록시가 사용되지 않습니다. 문자열은 표 17-2에 표시된 구성 요소를 수에 제한 없이 세미콜론으로 분리하여 포함할 수 있습니다.
브라우저는 사용할 수 없는 프록시 서버를 만나면 응답하지 않은 이전 프록시를 30분 후에 자동으로 다시 시도하고 이후 30분 간격으로 계속 시도합니다. 따라서 프록시 서버를 임시로 종료한 경우 클라이언트는 프록시가 재시작된 이후 30분 내에 프록시 사용을 재개하게 됩니다.
모든 프록시가 다운된 상태고 DIRECT 반환 값이 지정되지 않으면 브라우저는 사용자에게 임시로 프록시를 무시하고 직접 연결을 시도할 것인지 묻습니다. Navigator는 20분 후에 프록시를 재시도할 것인지 물으며, 이후 20분 간격으로 계속해서 묻습니다.
다음 예에서 반환 값은 브라우저에게 8080 포트의 w3proxy.example.com이라는 프록시를 사용하고, 이 프록시를 사용할 수 없는 경우 8080 포트의 proxy1.example.com이라는 프록시를 사용하라고 알립니다.
PROXY w3proxy.example.com:8080; PROXY proxy1.example.com:8080
다음 예에서 기본 프록시는 w3proxy.example.com:8080이며, 이 프록시를 사용할 수 없는 경우 브라우저는 proxy1.example.com:8080을 사용합니다. 두 프록시 모두 사용할 수 없는 경우 브라우저는 서버로 직접 이동하며 20분 후 브라우저는 사용자에게 첫 번째 프록시를 다시 시도할지 묻습니다.
PROXY w3proxy.example.com:8080; PROXY proxy1.example.com:8080; DIRECT
JavaScript 함수 및 환경
JavaScript에는 프록시에서 유용한 여러 가지의 미리 정의된 함수와 환경 조건이 있습니다. 각 함수는 특정 조건이 충족되는지 여부를 확인하고 true 및 false 값을 반환합니다. 관련된 유틸리티 함수는 DNS 호스트 이름 또는 IP 주소를 반환하기 때문에 예외입니다. 기본 FindProxyForURL 함수에서 이러한 함수를 사용하여 브라우저로 전송할 반환 값을 결정할 수 있습니다. 이러한 함수를 사용하는 방법은 이 장의 뒷부분에 나오는 예를 참조하십시오.
각 함수 또는 환경 조건은 이 절에 설명되어 있습니다. 프록시와 브라우저 통합에 적용되는 함수 및 환경 조건은 다음과 같습니다.
호스트 이름 기반 함수
관련 유틸리티 함수:
URL/호스트 이름 기반 조건
시간 기반 조건
호스트 이름 기반 함수
호스트 이름 기반 함수를 통해 호스트 이름 또는 IP 주소를 이용하여 사용할 프록시를 결정할 수 있습니다.
dnsDomainIs(host, domain)
dnsDomainIs() 함수는 URL 호스트 이름이 지정된 DNS 도메인에 속하는지 여부를 감지합니다. 이 함수는 예제 1: 로컬 호스트를 제외한 모든 서버 프록시 및 예제 2: 방화벽 외부의 로컬 서버 프록시에서 설명한 대로 로컬 도메인에 대해서는 프록시를 사용하지 않도록 브라우저를 구성하는 경우 유용합니다.
이 함수는 또한 요청을 수신하는 프록시가 URL이 속한 DNS 도메인을 기반으로 프록시 그룹에서 선택되는 상황에서 로드 밸런싱을 위해 여러 프록시를 사용하는 경우에도 유용합니다. 예를 들어 .edu가 포함된 URL을 한 프록시에, .com이 포함된 URL을 다른 프록시에 지정하여 로드 밸런싱하는 경우 dnsDomainIs()를 사용하여 URL 호스트 이름을 확인할 수 있습니다.
매개 변수:
host는 URL의 호스트 이름입니다.
domain은 호스트 이름을 시험할 대상 도메인 이름입니다.
반환:
true 또는 false
예를 들면 다음과 같습니다.
다음 문은 true입니다.
dnsDomainIs("www.example.com", ".example.com")
다음 문은 false입니다.
dnsDomainIs("www", ".example.com")
dnsDomainIs("www.mcom.com", ".example.com")isInNet(host, pattern, mask)
isInNet() 함수를 통해 URL 호스트 이름을 IP 주소로 변환하고 이 주소가 마스크에서 지정한 서브넷에 속하는지 시험할 수 있습니다. 이는 SOCKS에서 사용하는 IP 주소 패턴 일치와 같은 유형입니다. 예제 4: 서브넷으로 직접 연결을 참조하십시오.
매개 변수:
host는 DNS 호스트 이름 또는 IP 주소입니다. 호스트 이름이 전달되면 이 함수는 호스트 이름을 IP 주소로 변환합니다.
pattern은 점으로 분리된 형식의 IP 주소 패턴입니다.
mask는 IP 주소에서 일치시켜야 하는 부분을 결정하는 IP 주소 패턴 마스크입니다. 값이 0이면 무시, 255이면 일치를 의미합니다. 이 함수는 호스트의 IP 주소가 지정된 IP 주소 패턴과 일치하면 true입니다.
반환:
true 또는 false
예를 들면 다음과 같습니다.
이 문은 호스트의 IP 주소가 정확히 198.95.249.79와 일치하는 경우에만 true입니다.
isInNet(host, "198.95.249.79", "255.255.255.255")이 문은 호스트의 IP 주소가 198.95.*.*와 일치하는 경우에만 true입니다.
isInNet(host, "198.95.0.0", "255.255.0.0")isPlainhost name(host)
isPlainhost name() 함수는 요청된 URL의 호스트 이름이 단순한 호스트 이름인지 또는 정규화된 도메인 이름인지 감지합니다. 이 함수는 예제 1: 로컬 호스트를 제외한 모든 서버 프록시 및 예제 2: 방화벽 외부의 로컬 서버 프록시에서 설명한 대로 Netscape Navigator가 로컬 서버에 직접 연결하도록 하려는 경우 유용합니다.
매개 변수:
host는 호스트 이름에 도메인 이름이 없는 경우에만(점으로 분리된 구획이 없음) URL의 호스트 이름(포트 번호 제외)입니다.
반환:
host가 로컬인 경우 true, host가 원격인 경우 false
예를 들면 다음과 같습니다.
isPlainhost name("host")
host가 www와 같은 형태면 true를, 호스트가 www.example.com과 같은 형태면 false를 반환합니다.
isResolvable(host)
방화벽 내의 DNS가 내부 호스트만 인식할 경우 isResolvable() 함수를 사용하여 호스트 이름이 네트워크 내부인지 외부인지 시험할 수 있습니다. 이 함수를 사용하여 브라우저가 내부 서버에 대해서는 직접 연결을 사용하고 외부 서버에 대해서만 프록시를 사용하도록 구성할 수 있습니다. 방화벽 내의 내부 호스트가 다른 내부 호스트의 DNS 도메인 이름은 변환할 수 있지만 외부 호스트는 모두 변환할 수 없는 사이트에서 이 함수가 유용합니다. isResolvable() 함수는 호스트 이름을 IP 주소로 변환하기 위해 시도하면서 DNS를 참조합니다. 예제 3: 변환되지 않은 호스트만 프록시를 참조하십시오.
매개 변수:
host는 URL의 호스트 이름입니다. 호스트 이름 변환을 시도하며 성공하는 경우 true를 반환합니다.
반환:
호스트 이름을 변환할 수 있으면 true, 변환할 수 없으면 false를 반환합니다.
예를 들면 다음과 같습니다.
isResolvable("host")
host가 www와 같은 형태고 DNS를 통해 변환할 수 있으면 이 함수는 true를 반환합니다.
localHostOrDomainIs(host, hostdom)
localHostOrDomainIs() 함수는 정규화된 도메인 이름 또는 단순한 호스트 이름으로 액세스되는 로컬 호스트를 지정합니다. 예제 2: 방화벽 외부의 로컬 서버 프록시를 참조하십시오.
localHostOrDomainIs() 함수는 호스트 이름이 지정된 호스트 이름과 정확히 일치하거나 또는 호스트 이름에 정규화되지 않은 호스트 이름과 일치하는 도메인 이름 부분이 없는 경우 true를 반환합니다.
매개 변수:
host는 URL의 호스트 이름입니다.
hostdom은 일치시킬 정규화된 호스트 이름입니다.
반환:
true 또는 false
예를 들면 다음과 같습니다.
다음 문은 true입니다(정확히 일치).
localHostOrDomainIs("www.example.com", "www.example.com")
다음 문은 true입니다(호스트 이름 일치, 도메인 이름 지정되지 않음).
localHostOrDomainIs("www", "www.example.com")
다음 문은 false입니다(도메인 이름 불일치).
localHostOrDomainIs("www.mcom.com", "www.example.com")
다음 문은 false입니다(호스트 이름 불일치).
localHostOrDomainIs("home.example.com", "www.example.com")
관련 유틸리티 함수
관련 유틸리티 함수를 통해 도메인 단계, Netscape Navigator가 실행되는 호스트 또는 호스트의 IP 주소를 확인할 수 있습니다.
dnsDomainLevels(host)
dnsDomainLevels() 함수는 URL 호스트 이름에서 DNS 단계의 수(점의 수)를 확인합니다.
매개 변수:
host는 URL의 호스트 이름입니다.
반환:
DNS 도메인 단계의 수(정수)
예를 들면 다음과 같습니다.
dnsDomainLevels("www")
0을 반환합니다.
dnsDomainLevels("www.example.com")
2를 반환합니다.
dnsResolve(host)
dnsResolve() 함수는 지정된 호스트(보통 URL에 있음)를 IP 주소로 변환합니다. JavaScript 함수가 기존 함수로 수행할 수 있는 것보다 더 고급의 패턴 일치를 수행해야 하는 경우 이 함수가 유용합니다.
매개 변수:
host는 변환할 호스트 이름입니다. 지정된 DNS 호스트 이름을 IP 주소로 변환하고 점으로 분리된 문자열로 반환합니다.
반환:
점으로 4부분으로 분리된 IP 주소의 문자열 값
예를 들면 다음과 같습니다.
다음 예는 198.95.249.79 문자열을 반환합니다.
dnsResolve("home.example.com")
myIpAddress()
myIpAddress() 함수는 브라우저가 실행되는 호스트에 따라 JavaScript 함수가 다르게 작동해야 하는 경우 유용합니다. 이 함수는 브라우저를 실행 중인 컴퓨터의 IP 주소를 반환합니다.
반환:
점으로 4부분으로 분리된 IP 주소의 문자열 값
예를 들면 다음과 같습니다.
Navigator를 home.example.com 컴퓨터에서 실행 중인 경우 다음 예는 198.95.249.79 문자열을 반환합니다.
myIpAddress()
URL/호스트 이름 기반 조건
로드 밸런싱 및 라우팅을 위해 호스트 이름 또는 URL을 일치시킬 수 있습니다.
shExpMatch(str, shexp)
shExpMatch() 함수는 URL 호스트 이름 또는 URL 자체를 일치시킵니다. 이 함수는 주로 로드 밸런싱 및 URL을 여러 프록시 서버로 지능적으로 라우팅하는 데 사용됩니다.
매개 변수:
str은 비교할 문자열입니다(예: URL 또는 호스트 이름).
shexp는 비교 대상인 쉘 표현식입니다.
문자열이 지정된 쉘 표현식과 일치하면 이 표현식은 true입니다. 예제 6: shExpMatch()를 사용한 프록시 로드 밸런싱을 참조하십시오.
반환:
true 또는 false
예를 들면 다음과 같습니다.
첫 번째 예는 true를, 두 번째 예는 false를 반환합니다.
shExpMatch("http://home.example.com/people/index.html",
".*/people/.*")shExpMatch("http://home.example.com/people/yourpage/index.html",
".*/mypage/.*")시간 기반 조건
FindProxyForURL 함수가 날짜, 시간, 주중 요일에 따라 다르게 작동하도록 할 수 있습니다.
dateRange(년, 월, 일...)
dateRange() 함수는 특정 날짜나 날짜 범위를 감지할 수 있습니다(예: 1996년 4월 19일부터 1996년 5월 3일). 이 함수는 프록시에 유지 보수를 위한 다운 시간이 정기적으로 예약되어 있는 경우 등
FindProxyForURL 함수가 날짜에 따라 다르게 작동하도록 할 때 유용합니다.날짜 범위는 다음과 같이 여러 가지 방법으로 지정할 수 있습니다.
dateRange(day)
dateRange(day1, day2)
dateRange(mon)
dateRange(month1, month2)
dateRange(year)
dateRange(year1, year2)
dateRange(day1, month1, day2, month2)
dateRange(month1, year1, month2, year2)
dateRange(day1, month1, year1, day2, month2, year2)
dateRange(day1, month1, year1, day2, month2, year2, gmt)매개 변수:
day는 월의 일자에 대한 1부터 31까지의 정수입니다.
month는 다음 월 문자열 중 하나입니다.
JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DECyear는 연도에 대한 4자릿수 정수입니다(예: 1996).
gmt는 그리니치 표준시로 시간을 비교하도록 하는 GMT 문자열 또는 빈칸이며 이 경우 로컬 시간대에 있는 것으로 가정합니다. GMT 매개 변수는 모든 호출 프로파일에서 항상 마지막 매개 변수로 지정될 수 있습니다. 하나의 값만 지정된 경우(각 년, 월, 일 범주에서) 함수는 지정한 항목과 일치하는 날짜에만 true를 반환합니다. 두 값이 지정된 경우 첫 번째 지정 날짜에서 두 번째 지정 날짜 사이면 결과는 true입니다.
예를 들면 다음과 같습니다.
이 문은 로컬 시간대에서 각 월의 첫 번째 일이면 true입니다.
dateRange(1)이 문은 그리니치 표준시에서 각 월의 첫 번째 일이면 true입니다.
dateRange(1, "GMT")이 문은 각 월의 전반기에 대해 true입니다.
dateRange(1, 15)이 문은 각 연도의 12월 24일에서 true입니다.
dateRange(24, "DEC")이 문은 1995년 12월 24일에서 true입니다.
dateRange(24, "DEC", 1995)이 문은 해당 년도 1분기 동안 true입니다.
dateRange("JAN", "MAR")이 문은 각 연도의 6월 1일부터 8월 15일까지 true입니다.
dateRange(1, "JUN", 15, "AUG")이 문은 1995년 6월 1일부터 1995년 8월 15일까지 true입니다.
dateRange(1, "JUN", 15, 1995, "AUG", 1995)이 문은 1995년 10월부터 1996년 3월까지 true입니다.
dateRange("OCT", 1995, "MAR", 1996)이 문은 1995년 내내 true입니다.
dateRange(1995)이 문은 1995년 초부터 1997년 말까지 true입니다.
dateRange(1995, 1997)timeRange(시간, 분, 초...)
timeRange 함수는 오후 9시부터 오전 12시까지와 같은 하루 중의 특정 시간 또는 시간 범위를 감지합니다. 이 함수는 시간에 따라 FindProxyForURL 함수를 다르게 작동하도록 하려는 경우 유용합니다.
timeRange(hour)
timeRange(hour1, hour2)
timeRange(hour1, min1, hour2, min2)
timeRange(hour1, min1, sec1, hour2, min2, sec2)매개 변수:
hour는 시간을 표시하는 0부터 23까지의 수입니다(0은 자정, 23은 오후 11:00).
min은 분을 표시하는 0부터 59까지의 수입니다.
sec는 초를 표시하는 0부터 59까지의 수입니다.
gmt는 GMT 시간대인 경우 GMT 문자열이며 로컬 시간대인 경우 지정되지 않습니다. 이 매개 변수는 각 매개 변수 프로파일과 함께 사용할 수 있으며 항상 마지막 매개 변수입니다.
반환:
true 또는 false
예를 들면 다음과 같습니다.
이 문은 정오에서 오후 1:00까지 true입니다.
timerange(12, 13)이 문은 GMT 정오에서 오후 12:59까지 true입니다
timerange(12, "GMT")이 문은 오전 9:00에서 오후 5:00까지 true입니다.
timerange(9, 17)자정부터 자정 후 30초 사이까지 true입니다.
timerange(0, 0, 0, 0, 0, 30)weekdayRange(wd1, wd2, gmt)
weekdayRange() 함수는 특정 주중 요일 또는 월요일부터 금요일까지 등과 같은 주중 요일 범위를 감지합니다. 이 함수는 FindProxyForURL 함수를 주중 요일에 따라 다르게 작동하도록 하려는 경우 유용합니다.
매개 변수:
wd1 및 wd2는 다음 요일 문자열 중 하나입니다.
SUN MON TUE WED THU FRI SATgmt는 그리니치 표준시인 경우 GMT 또는 로컬 시간대인 경우 빈칸으로 둡니다.
첫 번째 매개 변수인 wd1만 필수 매개 변수입니다. wd2, gmt, 또는 둘 다 빈칸으로 둘 수 있습니다.
매개 변수가 하나 뿐이면 함수는 매개 변수가 나타내는 요일에서 true 값을 반환합니다. 두 번째 매개 변수로 GMT 문자열이 지정된 경우에는 GMT 시간이, 그렇지 않은 경우에는 로컬 시간대가 적용됩니다.
wd1과 wd2가 모두 정의된 경우 현재 요일이 이 두 요일의 사이에 있으면 조건은 true입니다. 경계선도 범위에 포함됩니다. 매개 변수의 순서가 중요합니다. "MON," "WED"는 월요일부터 수요일까지입니다. 그러나 "WED," "MON"은 수요일부터 다음주 월요일까지입니다.
예를 들면 다음과 같습니다.
다음은 월요일부터 금요일까지 true입니다(로컬 시간대).
weekdayRange("MON", "FRI")다음은 그리니치 표준시로 월요일부터 금요일까지 true입니다.
weekdayRange("MON", "FRI", "GMT")다음은 로컬 시간으로 토요일에 true입니다.
weekdayRange("SAT")다음은 그리니치 표준시로 토요일에 true입니다.
weekdayRange("SAT", "GMT")다음은 금요일부터 월요일까지 true입니다(순서 중요).
weekdayRange("FRI", "MON")세부적인 예
예제 1: 로컬 호스트를 제외한 모든 서버 프록시
이 예제에서 Netscape Navigator는 정규화되지 않고 로컬 도메인에 속하는 모든 호스트에 직접 연결합니다. 그 외의 모든 연결은 w3proxy.example.com:8080이라는 프록시를 통합니다.
예제 2: 방화벽 외부의 로컬 서버 프록시
이 예제는 앞의 예제와 같지만 방화벽 외부의 로컬 서버에 대해 프록시를 사용합니다. 로컬 도메인에 속하지만 방화벽 외부에 있고 프록시 서버를 통해서만 연결할 수 있는 호스트(예: 기본 웹 서버)인 경우 이와 같은 예외는 localHostOrDomainIs() 함수를 사용하여 다음과 같이 처리합니다:
function FindProxyForURL(url, host)
{
if ((isPlainhost name(host) ||
dnsDomainIs(host, ".example.com")) &&
!localHostOrDomainIs(host, "www.example.com") &&
!localHostOrDoaminIs(host, "merchant.example.com"))
return "DIRECT";
else
return "PROXY w3proxy.example.com:8080; DIRECT";
}이 예에서는 example.com 도메인의 로컬 호스트를 제외한 모든 대상에 대해 프록시를 사용합니다. www.example.com과 merchant.example.com 호스트도 프록시를 통하여 연결합니다.
예외의 순서는 효율성을 높입니다. localHostOrDomainIs() 함수는 모든 URL이 아니라 로컬 도메인에 있는 URL에 대해서만 실행됩니다. 특히 and 표현식 앞에 or 표현식이 괄호 안에 있음을 유의하십시오.
예제 3: 변환되지 않은 호스트만 프록시
이 예제는 내부 DNS를 설정하여 내부 호스트 이름만 변환하는 환경에서 동작하며, 변환할 수 없는 호스트에 대해서만 프록시를 사용하는 것이 목적입니다.
function FindProxyForURL(url, host)
{
if (isResolvable(host))
return "DIRECT";
else
return "PROXY proxy.mydomain.com:8080";
}이 예제는 매번 DNS를 참조해야 하므로 다른 규칙과 그룹화하여 다른 규칙이 결과를 생성하지 않는 경우에만 DNS를 참조하도록 해야 합니다.
function FindProxyForURL(url, host)
{if (isPlainhost name(host) ||
dnsDomainIs(host, ".mydomain.com") ||
isResolvable(host))
return "DIRECT";
else
return "PROXY proxy.mydomain.com:8080";
}
예제 4: 서브넷으로 직접 연결
이 예제에서 지정된 서브넷의 모든 호스트는 프록시를 통하는 다른 호스트로 직접 연결됩니다.
function FindProxyForURL(url, host)
{
if (isInNet(host, "198.95.0.0", "255.255.0.0"))
return "DIRECT";
elsereturn "PROXY proxy.mydomain.com:8080";
}다음과 같이 처음에 리던던트 규칙을 추가하면 이 예제에서 DNS 사용을 최소화할 수 있습니다.
function FindProxyForURL(url, host)
{
if (isPlainhost name(host) ||
dnsDomainIs(host, ".mydomain.com") ||
isInNet(host, "198.95.0.0", "255.255.0.0"))
return "DIRECT";
else
return "PROXY proxy.mydomain.com:8080";
}
예제 5: dnsDomainIs()을 사용한 프록시 로드 밸런싱
이 예제는 더 복잡합니다. 네 개의 프록시 서버가 있으며 이 중 한 프록시 서버는 다른 서버에 대한 상시 대기 역할을 하여 나머지 세 프록시 서버 중 하나가 다운되면 이를 대신합니다. 나머지 세 프록시 서버는 URL 패턴을 기반으로 로드를 공유함으로써 캐시의 효율성을 높입니다(한 문서에 대한 사본이 세 개의 프록시 서버 모두에 있는 것이 아니라 한 프록시 서버에만 있음). 로드는 표 17-3에서와 같이 분산됩니다.
모든 로컬 액세스는 직접 연결됩니다. 모든 프록시 서버는 8080 포트에서 실행됩니다. JavaScript에서 + 연산자를 사용하여 문자열을 연결할 수 있습니다.
function FindProxyForURL(url, host)
{
if (isPlainhost name(host) || dnsDomainIs(host, ".mydomain.com"))
return "DIRECT";
else if (dnsDomainIs(host, ".com"))
return "PROXY proxy1.mydomain.com:8080; " +
"PROXY proxy4.mydomain.com:8080";
else if (dnsDomainIs(host, ".edu"))
return "PROXY proxy2.mydomain.com:8080; " +
"PROXY proxy4.mydomain.com:8080";
else
return "PROXY proxy3.mydomain.com:8080; " +
"PROXY proxy4.mydomain.com:8080";
}
예제 6: shExpMatch()를 사용한 프록시 로드 밸런싱
이 예제는 기본적으로 예제 5와 동일하지만 dnsDomainIs() 대신 shExpMatch()를 사용합니다.
function FindProxyForURL(url, host)
{if (isPlainhost name(host) || dnsDomainIs(host, ".mydomain.com"))
return "DIRECT";
else if (shExpMatch(host, "*.com"))
return "PROXY proxy1.mydomain.com:8080; " +
"PROXY proxy4.mydomain.com:8080";
else if (shExpMatch(host, "*.edu"))
return "PROXY proxy2.mydomain.com:8080; " +
"PROXY proxy4.mydomain.com:8080";
else
return "PROXY proxy3.mydomain.com:8080; " +
"PROXY proxy4.mydomain.com:8080";
}
예제 7: 특정 프로토콜 프록시
프록시를 특정 프로토콜에 대해 설정할 수 있습니다. 대부분의 표준
JavaScript 기능은 FindProxyForURL() 함수에서 사용할 수 있습니다. 예를 들어 프로토콜을 기반으로 다른 프록시를 설정하려면 다음과 같이 substring() 함수를 사용할 수 있습니다.function FindProxyForURL(url, host)
{
if (url.substring(0, 5) == "http:") {
return "PROXY http-proxy.mydomain.com:8080";
}
else if (url.substring(0, 4) == "ftp:") {
return "PROXY ftp-proxy.mydomain.com:8080";
}
else if (url.substring(0, 7) == "gopher:") {
return "PROXY gopher-proxy.mydomain.com:8080";
}
else if (url.substring(0, 6) == "https:" ||
url.substring(0, 6) == "snews:") {
return "PROXY security-proxy.mydomain.com:8080";
}
else {
return "DIRECT";
}
}또한 shExpMatch() 함수를 사용해서도 마찬가지 기능을 수행할 수 있습니다. 예를 들면 다음과 같습니다.
...
if (shExpMatch(url, "http:*")) {
return "PROXY http-proxy.mydomain.com:8080;
}...