ProgramingTip

매개 변수에 슬래시가있는 URL?

bestdevel 2020. 11. 24. 08:17
반응형

매개 변수에 슬래시가있는 URL?


질문 :

기본적으로 wikipedia / mediawiki의 복제 본인 위키 소프트웨어를 만들고 권장하지 ASP.NET MVC에서 (MVC가 요점 ScrewTurn을).

이제 질문이 있습니다.

이 경로 매핑을 사용하여 다음과 같은 URL을 라우팅합니다.
http://en.wikipedia.org/wiki/ASP.NET

        routes.MapRoute(
            "Wiki", // Routenname
            //"{controller}/{action}/{id}", // URL mit Parametern
            "wiki/{id}", // URL mit Parametern
            new { controller = "Wiki", action = "dbLookup", id = UrlParameter.Optional } // Parameterstandardwerte
        );

이제는 'AS / 400'과 같은 제목이 있습니다.
http://en.wikipedia.org/wiki/AS/400

우연히도 이것도 있습니다 (제목 '슬래시') :
http://en.wikipedia.org/wiki//

그리고 이것 :
http://en.wikipedia.org/wiki//dev/null

전반적으로 Wikipedia에는 ​​다음과 같은 흥미로운 제목 목록이 있습니다. http://en.wikipedia.org/wiki/Wikipedia:Articles_with_slashes_in_title

이 경로와 같은 경로를 만들려면 어떻게해야합니까?

편집 :
뭔가 같은 :
가 / 위키 / 편집 / (하지만 / 위키 / 편집)로 시작하지 않는 경우 / 위키 /를 사용하여 URL의 시작은, 다음 모든 ID와 URL의 나머지 부분을 전달하는 경우.

편집 :
흠, 또 다른 문제 :이 문제를 어떻게 라우팅 할 수 있습니까? :
http://en.wikipedia.org/wiki/C&A

Wikipedia는 ...

편집 :
wikipedia에 따르면 wikitext 구문과의 충돌로 인해 다음 문자 만 페이지 제목에 사용할 수 없습니다.

# < > [ ] | { }

http://en.wikipedia.org/wiki/Wikipedia:Naming_conventions_(technical_restrictions)#Forbidden_characters

편집 :
* 및 &를 허용 비용

<httpRuntime requestPathInvalidCharacters="" />

web.config 파일의 <system.web> 섹션으로

(여기에서 찾았습니다 : http://www.christophercrooker.com/use-any-characters-you-want-in-your-urls-with-aspnet-4-and-iis )


catchall 경로를 사용 wiki하여 URL 부분 을 따르는 모든 것을 id토큰 에 배치 합니다.

routes.MapRoute(
    "Wiki",
    "wiki/{*id}",
     new { controller = "Wiki", action = "DbLookup", id = UrlParameter.Optional }
);

다음 요청 고객이 이제있는 경우 컨트롤러 /wiki/AS/400에서 다음 작업에 매핑됩니다 Wiki.

public ActionResult DbLookup(string id)
{
    // id will equal AS/400 here
    ...
}

지금까지처럼 /wiki//한 나는이 요청 이제까지 ASP.NET 파이프 라인에 도달하기 전에 웹 서버에서 400 잘못된 요청 오류가 발생합니다. 다음 블로그 게시물을 확인할 수 있습니다 .


에서 Attribute RoutingMVC 내가 가진 동일한에서 문제가 있었다 /문자열 abc/cde에를HttpGet

        [Route("verifytoken/{*token}")]
        [AllowAnonymous]
        [HttpGet]
        public ActionResult VerifyToken(string token)
        {
          //logic here
        }

*이 후에는 변수로 발송되어야합니다.


@Darin : 글쎄요, 그 정도는 분명합니다. 질문은 왜죠? 컨트롤러 + 액션 + ID가 주어집니다.이 모든 것을 라우팅에 다시 전달하는 것입니다 ... – Quandary

Quandry- 질문이 1 년이 넘었 기 때문에 이미 관리자 알아 냈을 수도 있습니다. RedirectToAction을 호출하면 HTTP 302 응답을 브라우저에 보내 브라우저가 지정된 작업에 GET 요청을 요청합니다. 따라서 당신이보고있는 무한 루프.

참조 : Controller.RedirectToAction 메서드


여전히 옵션으로 Global.asax 파일에 작성하십시오.

 var uri = Context.Request.Url.ToString();
        if (UriHasRedundantSlashes(uri))
        {
            var correctUri = RemoveRedundantSlashes(uri);
            Response.RedirectPermanent(correctUri);
        }
    }

    private string RemoveRedundantSlashes(string uri)
    {
        const string http = "http://";
        const string https = "https://";
        string prefix = string.Empty;

        if (uri.Contains(http))
        {
            uri = uri.Replace(http, string.Empty);
            prefix = http;
        }
        else if (uri.Contains(https))
        {
            uri = uri.Replace(https, string.Empty);
            prefix = https;
        }

        while (uri.Contains("//"))
        {
            uri = uri.Replace("//", "/");
        }

        if (!string.IsNullOrEmpty(prefix))
        {
            return prefix + uri;
        }
        return uri;
    }

    private bool UriHasRedundantSlashes(string uri)
    {
        const string http = "http://";
        const string https = "https://";

        if (uri.Contains(http))
        {
            uri = uri.Replace(http, string.Empty);
        }
        else if (uri.Contains(https))
        {
            uri = uri.Replace(https, string.Empty);
        }
        return uri.Contains("//");
    }

참고 URL : https://stackoverflow.com/questions/6328713/urls-with-slash-in-parameter

반응형