2013-10-10 3 views
0

ManagedFusion Rewriter를 역방향 프록시로 사용하고 있습니다. 구성은 매우 간단합니다.ManagedFusion Rewriter 404 후행 슬래시가없는 경우 404?

RewriteRule ^/api/(.*) http://www.example.com/api/$1 [P] 

이것은 모든 URL에서 작동합니다. 그러나 URL이 이 아니며 후행 슬래시로 끝나는이 아니라면 실패합니다.

이 같은 요청은 미세 완벽하게 갈 것입니다 : GET api/report/1

2013-10-10T11:27:13 [Rewrite] Input: http://localhost:50070/api/report/1 
2013-10-10T11:27:13 [Rule 0] Input: /api/report/1 
2013-10-10T11:27:13 [Rule 0] Rule Pattern Matched 
2013-10-10T11:27:13 [Rule 0] Output: http://www.example.com/api/report/1 
2013-10-10T11:27:13 [Rewrite] Proxy: http://www.example.com/api/report/1 
(the log file finishes right here) 

이를 : GET api/report/

2013-10-10T11:27:11 [Rewrite] Input: http://localhost:50070/api/report/ 
2013-10-10T11:27:11 [Rule 0] Input: /api/report/ 
2013-10-10T11:27:11 [Rule 0] Rule Pattern Matched 
2013-10-10T11:27:11 [Rule 0] Output: http://www.example.com/api/report/ 
2013-10-10T11:27:11 [Rewrite] Proxy: http://www.example.com/api/report/ 
2013-10-10T11:27:11 ********************************************************************************** 
2013-10-10T11:27:11 [Proxy] Request: http://www.example.com/api/report/ 
2013-10-10T11:27:12 [Proxy] System.Net.HttpWebResponse 
2013-10-10T11:27:12 [Proxy] Received '200 OK' 
2013-10-10T11:27:12 [Proxy] Response: http://localhost:50070/api/report/ 
2013-10-10T11:27:12 [Proxy] Response is being buffered 
2013-10-10T11:27:12 [Proxy] Responding '200 OK' 

그러나,이 같은 요청에도 프록시 URL에 대한 요청을하지 않고 404을 반환합니다 내 전체 구성 파일입니다 :

RewriteEngine On 
RewriteLog "log.txt" 
RewriteLogLevel 9 
RewriteRule ^/api/(.*) http://www.example.com/api/$1 [P] 

내가 틀릴 수도 있습니다.

답변

0

편집 : 내 해결 방법이 Rewriter 코드베이스의 해결책으로 받아 들여 졌으므로이 대답을 허용 할 것입니다. 가능한 방법에 대한 피드백을 제공하십시오.


해결 방법을 찾았지만 이것이 실제 해결책이라고 생각하지 않으므로 직접 질문에 답할 것이지만 대답으로 받아들이지 않을 것입니다. (운명은 변덕스러운 여주인이 아닙니다.)

ManagedFusion.Rewriter의 소스 코드 (GitHub의 최신 버전, 여기 : https://github.com/managedfusion/managedfusion-rewriter/releases)를 다운로드하여 코드베이스에 통합했습니다.

클래스 ManagedFusion.Rewriter.RewriterModule는 다음 두 가지 방법을 포함

private void context_PostResolveRequestCache(object sender, EventArgs e) 
{ 
    var context = new HttpContextWrapper(((HttpApplication)sender).Context); 

    // check to see if this is a proxy request 
    if (context.Items.Contains(Manager.ProxyHandlerStorageName)) 
     context.RewritePath("~/RewriterProxy.axd"); 
} 

private void context_PostMapRequestHandler(object sender, EventArgs e) 
{ 
    var context = new HttpContextWrapper(((HttpApplication)sender).Context); 

    // check to see if this is a proxy request 
    if (context.Items.Contains(Manager.ProxyHandlerStorageName)) 
    { 
     var proxy = context.Items[Manager.ProxyHandlerStorageName] as IHttpProxyHandler; 

     context.RewritePath("~" + proxy.ResponseUrl.PathAndQuery); 
     context.Handler = proxy; 
    } 
} 

이름에서 알 수 있듯이, 두 번째는 PostMapRequestHandler 대한 핸들러가있는 동안, 제 한 PostResolveRequestCache의 핸들러이다.

예제 요청시 모두 PostResolveRequestCache 처리기가 호출되어 정상적으로 작동합니다. 그러나 실패한 요청의 경우 PostMapRequestHandler이 실행되지 않았습니다.

이것은 어떤 이유로 인해 RewritePath의 사용법을 통해 파일처럼 보이는 리소스의 디렉토리처럼 보이지 않는 특정 리소스를 다시 작성하면 실제 실제 처리기가 선택되지 않았다고 생각했습니다. 따라서 PostMapRequestHandler의 발생을 방지합니다. 이와 같이

, 나는 4.5 .NET 3.5에서 Rewriter는 프로젝트를 업그레이드하고이 라인을 교체 :이 사람에 의해

if (context.Items.Contains(Manager.ProxyHandlerStorageName)) 
    context.RewritePath("~/RewriterProxy.axd"); 

이와

if (context.Items.Contains(Manager.ProxyHandlerStorageName)) { 
    var proxyHandler = context.Items[Manager.ProxyHandlerStorageName] as IHttpHandler; 
    context.RemapHandler(proxyHandler); 
} 

을, 모든 요청이 제대로 포착되고 있었다 핸들러가 작업을 시작했다.

RewriteRule ^/api/(.*) http://www.example.com/api/$1 [QSA,P,NC] 
  • QSA는 쿼리 문자열을 추가 할 : 보조 노트로

    , 나는 그것은 있었어야

    RewriteRule ^/api/(.*) http://www.example.com/api/$1 [P] 
    

    대신, 원래의 규칙 몇 가지 실수를했다 원래 요청의 내용과 일치하도록

  • NC 대소 문자를 구별하지 않음