Sun Java System Web Proxy Server 4.0.8 관리 설명서

JavaScript 함수 및 환경

JavaScript 언어에는 프록싱 사용에 유용한 미리 정의된 함수와 환경 조건이 있습니다. 이러한 각 함수는 특정 조건을 만족하는지 여부를 확인한 다음 true 또는 false 값을 반환합니다. 관련 유틸리티 함수는 DNS 호스트 이름 또는 IP 주소를 반환하기 때문에 예외입니다. 기본 FindProxyForURL () 함수에서 이러한 함수를 사용하여 브라우저에 보낼 반환 값을 결정할 수 있습니다. 이 장의 뒷부분에서는 이러한 함수 사용에 대한 개념을 예를 들어 설명합니다.

각 함수 또는 환경 조건에 대해서는 이 절에서 설명합니다. 브라우저와 프록시 통합에 적용된 함수 및 환경 조건은 다음과 같습니다.

호스트 이름 기반 함수

호스트 이름 기반 함수를 통해 호스트 이름 또는 IP 주소를 사용하여 어떤 프록시(있는 경우)를 사용할지 결정할 수 있습니다.

dnsDomainIs()(호스트, 도메인)

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()(호스트, 패턴, 마스크)

isInNet()() 함수를 사용하여 IP 주소에 대한 URL 호스트 이름을 확인하고 마스크에 의해 지정된 서브넷에 속하는지 여부를 테스트할 수 있습니다. 이것은 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()(호스트)

isPlainhost name()() 함수는 요청한 URL의 호스트 이름이 일반 호스트 이름 또는 정규화된 도메인 이름인지 여부를 확인합니다. 이 함수는 예 1: 로컬 호스트를 제외한 모든 서버 프록시 예 2: 방화벽 외부의 로컬 서버 프록시에 설명된 대로 브라우저를 로컬 서버에 직접 연결하려는 경우 유용합니다.

매개 변수

host는 호스트 이름에 도메인 이름이 없는 경우(점으로 구분된 세그먼트 없음)에만 포트 번호를 제외하고 URL의 호스트 이름입니다.

반환 값

host가 로컬인 경우 true이고 host가 원격인 경우 false입니다.

isPlainhost name("host")

hostwww와 같은 문자열인 경우 함수는 true를 반환합니다. 호스트가 www.example.com과 같은 문자열인 경우 함수는 false를 반환합니다.

isResolvable()(호스트)

방화벽 내의 DNS가 내부 호스트만 인식하는 경우 isResolvable()() 함수를 사용하여 호스트 이름이 네트워크에 대해 내부 또는 외부인지 여부를 테스트할 수 있습니다. 이 함수를 사용하면 내부 서버에 대한 직접 연결을 사용하고 외부 서버에 대해서만 프록시를 사용하도록 브라우저를 구성할 수 있습니다. 이 함수는 방화벽 내의 내부 호스트가 다른 내부 호스트의 DNS 도메인 이름을 확인할 수 있지만 모든 외부 호스트를 확인할 수 없는 사이트에서 유용합니다. isResolvable()() 함수는 DNS를 참조하여 호스트 이름을 IP 주소로 확인하려고 합니다. 예 3: 확인되지 않은 호스트만 프록시를 참조하십시오.

매개 변수

host()는 URL의 호스트 이름입니다.

반환 값

함수가 호스트 이름을 확인할 수 있는 경우 true이고 확인할 수 없으면 false입니다.

isResolvable("host")

host()www와 같은 문자열이고 DNS를 통해 확인할 수 있는 경우 이 함수는 true를 반환합니다.

localHostOrDomainIs()(호스트, 호스트 도메인)

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")

유틸리티 함수

유틸리티 함수를 사용하여 도메인 수준, 브라우저가 실행 중인 호스트 또는 호스트의 IP 주소를 찾을 수 있습니다.

dnsDomainLevels()(hot)

dnsDomainLevels()() 함수는 URL 호스트 이름에서 DNS 수준 번호(점의 수)를 찾습니다.

매개 변수

host는 URL의 호스트 이름입니다.

반환 값

DNS 도메인 수준의 번호(정수)입니다.

dnsDomainLevels("www")는 0을 반환합니다.

dnsDomainLevels("www.example.com")는 2를 반환합니다.

dnsResolve()(host)

dnsResolve()() 함수는 보통 URL로부터 제공되는 호스트의 IP 주소를 확인합니다. 이 함수는 JavaScript 함수가 기존 함수로 수행할 수 있는 것보다 고급 패턴 일치를 수행해야 하는 경우 유용합니다.

매개 변수

host는 확인할 호스트 이름입니다. 지정된 DNS 호스트 이름을 IP 주소로 확인하고 점으로 구분된 형식으로 문자열로 반환합니다.

반환 값

문자열 값인 점으로 구분된 네 개의 IP 주소

다음 예에서는 문자열 198.95.249.79를 반환합니다.

dnsResolve("home.example.com")

myIpAddress()()

myIpAddress()() 함수는 브라우저가 실행되는 호스트에 따라 JavaScript 함수가 다르게 동작해야 하는 경우 유용합니다. 이 함수는 브라우저를 실행하는 컴퓨터의 IP 주소를 반환합니다.

반환 값

문자열 값인 점으로 구분된 네 개의 IP 주소

예:

다음 예에서는 컴퓨터 home.example.com에서 Navigator를 실행하는 경우 문자열 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 DEC

year는 연도 숫자에 대한 네 자리 정수입니다(예: 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년 1월1일부터 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시입니다.

min은 0에서 59 사이의 분 값입니다.

sec는 0에서 59 사이의 초 값입니다.

gmt는 GMT 시간대의 GMT 문자열이거나 로컬 시간대에 대해 지정되지 않습니다. 다음 매개 변수는 각 매개 변수 프로필과 함께 사용할 수 있으며 항상 마지막 매개 변수입니다.

반환 값

true 또는 false

예:

다음 문은 정오부터 오후 1시 사이에 true입니다.m: timerange(12, 13)

다음 문은 GMT 기준으로 정오부터 오후 12시 59분 사이에 true입니다. timerange(12, "GMT")

다음 문은 오전 9시부터 오후 5시 사이에 true입니다.m: timerange(9, 17)

다음 문은 자정부터 자정에서 30초 경과한 시간 사이에 true입니다. timerange(0, 0, 0, 0, 0, 30)

weekdayRange()(wd1, wd2, gmt)

weekdayRange() 함수는 월요일에서 금요일 사이와 같이 특정 요일 또는 요일 범위를 검색합니다. 이 함수는 요일에 따라 FindProxyForURL 함수가 다르게 작동하게 하려는 경우 유용합니다.

매개 변수

wd1wd2는 다음 요일 문자열 중 하나입니다. SUN MON TUE WED THU FRI SAT

gmt는 그리니치 표준시의 경우 GMT이거나 로컬 시간의 경우 그대로 둡니다.

첫 번째 매개 변수 wd1만 필수 사항입니다. wd2, gmt 또는 두 개 모두 비워 둘 수 있습니다.

하나의 매개 변수만 있는 경우 함수는 매개 변수가 표시하는 요일에 true 값을 반환합니다. 문자열 GMT가 두 번째 매개 변수로 지정된 경우 시간이 GMT로 제공됩니다. 그렇지 않을 경우 시간은 로컬 시간대로 제공됩니다.

wd1wd2가 모두 정의된 경우 조건은 현재 요일이 이 두 요일 사이에 있을 경우 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")

함수 예

다음 절에서는 JavaScript 함수에 대해 예를 들어 자세히 설명합니다.

예 1: 로컬 호스트를 제외한 모든 서버 프록시

이 예에서는 브라우저가 정규화되지 않은 모든 호스트와 로컬 도메인에 있는 호스트에 직접 연결합니다. 다른 모든 호스트는 w3proxy.example.com:8080이라는 프록시와 연결됩니다.


주 –

프록시가 중단되면 자동으로 직접 연결됩니다.


    function FindProxyForURL(url, host)
    {
        if (isPlainhost name(host) ||
            dnsDomainIs(host, ".example.com") ||
            dnsDomainIs(host, ".mcom.com"))
            return "DIRECT";
        else
            return "PROXY w3proxy.example.com:8080; DIRECT";
    }

예 2: 방화벽 외부의 로컬 서버 프록시

이 예는 예 1: 로컬 호스트를 제외한 모든 서버 프록시와 비슷하지만 방화벽 외부에 있는 로컬 서버의 프록시를 사용합니다. 기본 웹 서버와 같은 호스트는 로컬 도메인에 속하지만 방화벽 외부에 있어서 프록시 서버를 통해서만 접근할 수 있는 경우 이러한 예외는 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.commerchant.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";
        else
            return "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()()로 프록시 로드 균형 조정

이 예는 훨씬 복잡합니다. 이 예에서는 4개의 프록시 서버를 사용하며 그 중 하나는 다른 서버에 대해 상시 대기 역할을 수행합니다. 나머지 3개의 프록시 서버가 중단될 경우 네 번째 서버가 역할을 수행합니다. 나머지 3개의 프록시 서버는 URL 패턴을 기준으로 로드를 공유하여 캐싱을 훨씬 효율적으로 수행합니다. 각 서버에 복사본이 하나만 있는 경우와 달리 모든 문서의 복사본이 세 개의 서버에 하나만 존재합니다. 로드는 다음 표에 표시된 것처럼 분산됩니다.

표 17–3 프록시 로드 균형 조정

프록시 

용도 

#1 

.com 도메인

#2 

.edu 도메인

#3 

기타 모든 도메인 

#4 

상시 대기 

모든 로컬 액세스가 직접 연결되어야 합니다. 모든 프록시 서버가 포트 8080에서 실행됩니다. + 연산자를 사용하여 문자열을 연결할 수 있습니다.

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()()로 프록시 로드 균형 조정과 동일하지만 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;
    }
    ...