URL 재작성 조건이 두 서버 변수를 비교할 수 있습니까?

URL 재작성 조건이 두 서버 변수를 비교할 수 있습니까?

URL 재작성 조건의 일부로 두 서버 변수를 비교하려고 합니다. 하지만 먼저, 몇 가지 맥락이...

IIS에서 디렉터리를 요청하면 http://www.example.com/fooIIS foo는 302 "객체 이동" 리디렉션을 http://www.example.com/foo/"의례 리디렉션"(원천).

SSL 오프로딩을 통해 IIS+ARR을 역방향 프록시로 사용하는 경우 백엔드 IIS 노드가 수신하는 요청은 https가 아닌 http를 통해 이루어집니다.

이 두 가지 동작을 결합하면 IIS의 무료 리디렉션이 SSL을 삭제합니다. 무료 리디렉션은 IIS가 받은 요청과 동일한 체계를 사용합니다(원천), 이 경우 https 대신 http입니다.

이 경우 들어오는 URL을 나가는 Location 헤더와 비교하고 이를 http에서 https로 다시 쓰는 아웃바운드 다시 쓰기 규칙을 만들고 싶습니다.

  • 응답은 리디렉션입니다. {RESPONSE_STATUS}302입니다.
  • 들어오는 요청이 SSL을 통해 이루어졌습니다: {HTTPS}"on"입니다.
  • 수신 URL은 슬래시로 끝나지 않습니다.
  • 나가는 Location 헤더는 슬래시로 끝납니다.

위의 모든 내용은 전제 조건에서 처리됩니다. 까다로운 부분은 마지막 부분입니다.

  • 나가는 Location 헤더의 경로는 슬래시가 추가된 수신 URL과 동일합니다.

아래는 지금까지 가지고 있는 코드입니다. 전제조건과 헤더 재작성은 모두 잘 작동합니다. 그러나 이 조건은 500 오류(URL 재작성 모듈 오류)를 발생시킵니다. 아마도 {REQUEST_URI}패턴에서 사용하고 있기 때문일 것입니다. 조건을 2개로 분리하고 캡처 그룹을 사용해 보았으나 역시 소용이 없었습니다. 어떤 아이디어가 있나요?

<rule name="Fix: Courtesy Redirect + SSL Offloading = SSL dropped" preCondition="Courtesy Redirect Drops SSL" enabled="true">
    <match serverVariable="RESPONSE_LOCATION" pattern="^http://(.+/)$" />
    <conditions>
        <add input="{RESPONSE_LOCATION}" pattern="{REQUEST_URI}/" />
    </conditions>
    <action type="Rewrite" value="https://{R:1}" />
</rule>
<preConditions>
    <preCondition name="Courtesy Redirect Drops SSL">
        <add input="{RESPONSE_STATUS}" pattern="^302$" />
        <add input="{HTTPS}" pattern="^on$" />
        <add input="{REQUEST_URI}" pattern=".*[^/]$" />
        <add input="{RESPONSE_LOCATION}" pattern="^http://.+/$" />
    </preCondition>
</preConditions>

답변1

당신은 사용할 수 있습니다사용자 정의 재작성 공급자.공급자는 한 문자열을 다른 문자열로 변환하는 C# 코드입니다. 그런 다음 맵 재작성을 사용하는 방법과 비슷한 방식으로 사용할 수 있습니다.

URL에서 전혀 유효하지 않은 구분 기호를 선택할 수 있습니다. (스페이스 등을 사용할 수도 있습니다. |이 게시물에 표시되도록 사용할 예정이지만 다른 문자열을 선택해야 합니다.)

서버 변수의 값을 설정하는 규칙을 작성합니다 IsItMatching. 서버 변수의 값은 사용자 정의 URL 재작성 공급자를 사용하여 설정됩니다.

{provider_name:{server_variable_1}|{server_variable_2}}

그러면 공급자를 구현하는 C# 코드가 다음을 수행합니다(의사 코드, 오류 검사 없음).

string Rewrite(string input)
{
    string[] inputVariables = input.split(separator);
    if (inputVariables[0] == inputVariables[1] + "/")
        return "yes";
    else
        return "no";
}

IsItMatching그런 다음 서버 변수의 값이 "yes" 또는 "no" 인지 확인하는 규칙을 하나 더 작성합니다 .

관련 정보