2009-12-09 4 views
5
Dim x AS New URI("http://www.example.com/test//test.asp") 
Dim rel AS New URI("http://www.example.com/xxx/xxx.asp") 
Console.Writeline(x.MakeRelativeUri(rel).Tostring()) 

제대로 작동하도록 :정규화 URI는 출력이가 여기에서 MakeRelativeUri

거의 모든 웹 서버는 다음과 같은 요청이 처리 할 올바른 보이는
../../xxx/xxx.asp 

:

http://www.example.com/test//test.asp 
http://www.example.com/test/test.asp 

이 동작을 수정하는 가장 좋은 방법은이 작업을 수행 할 API가 있거나 수동으로 새 URI를 만들고 경로에서 // 모두 제거해야합니다.

답변

4

모든 다중 슬래시를 LocalPath 부분의 슬래시로 바꾸는 것이 가장 좋은 방법입니다. ASP.net에 URL을 전달할 때도 IIS가 그렇게합니다.

다음 코드는 트릭을 수행합니다.

x = new Uri(string.Format("{0}://{1}:{2}{3}{4}", x.Scheme, x.Host, x.Port, Regex.Replace(x.LocalPath, @"(?<!\:)/{2,}", "/"), x.Query)); 
0

먼저 코드가 C#이지만 VB가 아니므로 태그가 잘못되었습니다.

대신이 코드를 사용하여 // 기본 URL에있는 "올바른"URL을 제공하고 폐기 할 수 있습니까?

var x2 = new Uri(x, rel); 

또는 URL에서 ../backtracking을 얻는 것이 중요합니까?

MakeRelativeUri 함수는 RFC에 따라 올바르지 만 일반적인 규칙에 따라 실패합니다. 내가 직접 URL을 정상화하거나 가능하면 위의 예를 사용하는 것이 좋습니다.

x = new Uri(Regex.Replace(x.OriginalString, "[^:]//", "/")); 
+0

그 코드는 여러 시나리오에서 작동하지 않으므로 매우 원시적 인 해킹입니다. 가장 명확하게 http://example.com/test///xxx입니다. 두 번째로 인코딩이 잘되어 있지 않지만 유효한 URI : http://example.com/?bla=//Whatup –

+0

Dr.Evil : 유효한 URL은 웹 서버가 해석하는 방식과 URL을 구문 분석 할 때 얼마나 강력한 지 결정했습니다. 프레임 워크가 원하는대로 모든 정리 작업을 수행하지 않으므로 슬래시를 적절하게 검사하고 지우는 "makerelativeurl"함수를 직접 작성하십시오. RFC를 따르거나 URL이 명확하지 않은 경우를 처리해야합니까? .) –