2017-11-06 40 views
0

IIS10 서버에 ARR 3.0 및 URL 재 작성 모듈 2.1이 있으며 다른 여러 웹 서버의 역방향 프록시 역할을합니다. 다른 서버는 다른 포트에서 실행되므로 IIS10 서버는 포트 80에서 '친숙한 URL'을 제공합니다. URL 재 작성은 요청을 백 엔드 서버로 전달하는 데 사용됩니다.IIS10 URL 재 작성 2.1 이중 인코딩 문제

이러한 서버 중 하나는 Jenkins입니다.

Jenkins에는 역방향 프록시가 올바르게 구성되었는지 (more details here) 알려주는 경고 메시지가 표시되며이 경고 메시지는 역방향 프록시에서 문제를 찾는 데 도움이됩니다.

문제는 URL 재 작성이 브라우저가 요청한 것과 다른 Jenkins에 도달 할 때까지 URL을 디코딩하고 인코딩한다는 것입니다.

예 :

URL 재 작성 규칙 :

<rule name="Jenkins Rewrite" stopProcessing="true"> <match url="(.*)" /> <conditions> <add input="{HTTP_HOST}" pattern=".*jenkins.mydomain.*" /> <add input="{HTTPS}" pattern="on" /> </conditions> <action type="Rewrite" url="http://localhost:8080/{R:1}" appendQueryString="true" /> <serverVariables> <set name="HTTP_X_FORWARDED_HOST" value="{HTTP_HOST}" /> <set name="HTTP_X_FORWARDED_SCHEMA" value="https" /> <set name="HTTP_X_FORWARDED_PROTO" value="https" /> </serverVariables> </rule> 

다음 URL을 전송 :

https://jenkins.mydomain/administrativeMonitor/hudson.diagnosis.ReverseProxySetupMonitor/testForReverseProxySetup/https%3A%2F%2Fjenkins.mydomain%2Fmanage%3F

내가 눈치가 인코딩 된 채널 만드는 규칙을 트리거하기 전에 디코딩되고 aracters는 {R은 : 1}이처럼 보이는 : /administrativeMonitor/hudson.diagnosis.ReverseProxySetupMonitor/testForReverseProxySetup/https:/jenkins.mydomain/manage/

을 내가 대신 의 {R : 1} {UNENCODED_URL}을 사용할 수 있다는 것을 발견 몇 가지 조사 후로를 디코딩 전에 요청 문자열을 얻을, 그래서 난 내 규칙 작업 조정 :

: 이중 인코딩 된 젠킨스에 의해 수신 된 URL을,

<action type="Rewrite" url="http://localhost:8080{UNENCODED_URL}" appendQueryString="false" />

는 불행하게도 URL 재 작성 내 재 작성 후 URL을 다시 인코딩됩니다

/administrativeMonitor/hudson.diagnosis.ReverseProxySetupMonitor/testForReverseProxySetup/https%253A%252F%252Fjenkins.mydomain%252Fmanage%253F

짧은 요약 :

이 URL에서 볼 : 이 /administrativeMonitor/hudson.diagnosis.ReverseProxySetupMonitor/testForReverseProxySetup/https%3A%2F%2Fjenkins.mydomain%2Fmanage%3F

우리가해야하는 것은 : /administrativeMonitor/hudson.diagnosis.ReverseProxySetupMonitor/testForReverseProxySetup/<parameter1>

<parameter1> = https%3A%2F%2Fjenkins.mydomain%2Fmanage%3F

슬래시 <parameter1>의 문자는 Jenkins가 path의 일부이며 무엇이 <parameter1>인지 알 수 있도록 인코딩됩니다.

즉, URL 재 작성 URL이 디코딩 될 때 <parameter1>이 나머지 path과 섞여 있음을 의미합니다.

원하는 결과는 브라우저가 보낸 정확히 URL을 받고 있지만 로컬 호스트를 가리키는 :

http://localhost:8080/administrativeMonitor/hudson.diagnosis.ReverseProxySetupMonitor/testForReverseProxySetup/https%3A%2F%2Fjenkins.mydomain%2Fmanage%3F

을 거기 어쨌든 URL 재 작성 모듈이하고있는 것을이 디코딩/인코딩 작업을하지 않으려면?

추신 : URL 다시 쓰기 v2.1 기능과 관련하여 blog post을 발견했으며이 동작을 비활성화하는 데 사용할 수있는 새 플래그가 있음을 알았지 만 설정 방법이나 힌트가 없습니다. 하나 UNENCODED_URL를 사용하려고 할 때 이전 v7.1.1980에 URL 재 작성 버전에서

, URL 재 작성은 원래의 URL이 이미이 섹션을 위반 에 인코딩 된 경우 이중 인코딩으로 이어질 수를 인코딩합니다 RFC3986의 2.4 버전은 " 은 동일한 문자열을 두 번 이상 백분율 인코딩 또는 디코딩하지 않아야합니다. 이미 디코딩 된 문자열 을 디코딩하면 백분율 데이터 옥텟을 백분율 인코딩의 시작으로 잘못 해석 할 수 있습니다. 이미 백분율로 인코딩 된 문자열을 백분율로 인코딩하는 경우 " " 또한 은 UNENCODED_URL을 사용하지 못하게했으며, 특히 ARR을 사용하는 전달자 시나리오의 경우 백엔드 서버에서는 URL 이 수정되지 않고 전달 될 것으로 예상합니다.

v7.1.1980에서 을 true로 설정하면이 비준수 URL 인코딩을 해제 할 수있는 기능 플래그 useOriginalURLEncoding 을 추가합니다. 기본 동작은 변경되지 않고 입니다 (useOriginalURLEncoding은 기본적으로 true입니다).

여기에있는 사람 중 누구 한테 어떻게 할 수 있습니까?

답변

0

내가 질문에 참조 된 게시물에 설명 useOriginalURLEncoding = false을 설정하여, 문제를 해결하기 위해 관리를 해결하는 또 다른 방법.

깃발을 IIS Manager으로 설정하려면 을 선택하고 system.webServer/rewrite/rules 부분으로 이동하여 useOriginalURLEncoding 플래그를 찾으십시오.

플래그를 false로 설정하면 규칙에서 {UNENCODED_URL} 변수를 사용할 때 URL 재 작성에서 더 이상 URL을 인코딩하지 않습니다.

0

UrlEncode 기능으로이를 수행 할 수 있습니다.

<action type="Rewrite" url="http://localhost:8080/{UrlEncode:{R:1}}" appendQueryString="true" /> 

UPDATE : 당신의 규칙을 변경 에게 문제

<rule name="Jenkins Rewrite" stopProcessing="true"> 
    <match url="(.*)" /> 
    <conditions> 
     <add input="{UNENCODED_URL}" pattern="(.*)" /> 
     <add input="{HTTP_HOST}" pattern=".*jenkins.mydomain.*" /> 
     <add input="{HTTPS}" pattern="on" /> 
    </conditions> 
    <action type="Rewrite" url="http://localhost:8080{C:1}" appendQueryString="true" /> 
    <serverVariables> 
    <set name="HTTP_X_FORWARDED_HOST" value="{HTTP_HOST}" /> 
    <set name="HTTP_X_FORWARDED_SCHEMA" value="https" /> 
    <set name="HTTP_X_FORWARDED_PROTO" value="https" /> 
    </serverVariables> 
</rule> 
+0

이전에 인코딩 된 슬래시 문자는 인코딩되지 않기 때문에 작동하지 않습니다. 당신이 요청 URL에 자세히 보면 당신이 마지막 조각임을 알 수 있습니다 : '/ HTTPS % 3A % 2F % 2Fjenkins.mydomain % 2Fmanage % 3F' 여기서 '% 2 층 = /' –

+0

흠, 차이점을 찾을 수 없습니다.'Rewrite' 단어를'Redirect'로 바꾸고 그 결과가'/'와 문제가 있는지 비교해보십시오. –

+0

Redirect는 이전과 같은 문제가 있습니다. 나는 질문을 편집했다. 실제 문제는 인코딩 된 슬래시 문자가 Jenkins의 페이지가 아닌 매개 변수에 속하는 것입니다. –