매개 변수에 슬래시가있는 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 구문과의 충돌로 인해 다음 문자 만 페이지 제목에 사용할 수 없습니다.
# < > [ ] | { }
편집 :
* 및 &를 허용 비용
<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 Routing
MVC 내가 가진 동일한에서 문제가 있었다 /
문자열 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
'ProgramingTip' 카테고리의 다른 글
GCC에서 std = c99 플래그 설정 (0) | 2020.11.24 |
---|---|
C ++ : 배열 용 생성자 이니셜 라이저 (0) | 2020.11.24 |
IntelliJ IDEA가 사용하지 않는 패키지를 삭제하는 것을 방지하는 방법은 무엇입니까? (0) | 2020.11.24 |
특정 버전을 사용하도록 Python 펼쳐서 지시하는 방법 (0) | 2020.11.24 |
'체크 아웃되지 않은'브랜치 푸시 (0) | 2020.11.24 |