내가 만들고있는 블로그에 Facebook 덧글 플러그인을 사용하고 있습니다. 그것은 페이지에서 참조 된 페이스 북 자바 스크립트에 의해 해석되는 몇 가지 FBXML 태그를 가지고 있습니다.
이 모든 것은 정상적으로 작동하지만 현재의 정규화 된 URL을 플러그인에 전달해야합니다.
<div style="width: 900px; margin: auto;">
<div id="fb-root"></div>
<fb:comments href="URL HERE" num_posts="10" width="900"></fb:comments>
</div>
현재 페이지의 URL을 가져 오는 가장 좋은 방법은 무엇입니까? 요청 URL입니다.
내 솔루션의 최종 코드는 다음과 같습니다.
<fb:comments href="@Request.Url.AbsoluteUri" num_posts="15" width="900"></fb:comments>
Request.RawUrl
, Request.Url.OriginalString
, Request.Url.ToString()
또는 Request.Url.AbsoluteUri
를 사용할 수 있습니다.
코드에 다음 확장 메서드를 추가하십시오.
public static Uri UrlOriginal(this HttpRequestBase request)
{
string hostHeader = request.Headers["Host"];
return new Uri(string.Format("{0}://{1}{2}",
request.Url.Scheme,
hostHeader,
request.RawUrl));
}
그런 다음 RequestContext.HttpContext.Request
속성에서 실행할 수 있습니다.
로컬 웹 사이트에 포트 80이 아닌 다른 포트를 사용하는 시스템에서 발생하는 Asp.Net에서 버그가 있습니다 (내부 웹 사이트가 가상 IP에서로드 균형 조정을 통해 게시되는 경우 큰 문제가 있음) 포트는 규칙을 게시하기 위해 내부적으로 사용됩니다). Asp.Net은 원래 요청이 그것을 사용하지 않더라도 항상AbsoluteUri
속성의 포트를 추가합니다.
이 코드는로드 균형 조정 등을 수행하기 전에 반환 된 URL이 브라우저 원래요청 된 포트 (호스트 헤더에 포함 된 포트 포함))와 항상 일치하도록합니다.
적어도, 그것은 우리의 (다소 복잡한) 환경에서 수행합니다 :)
호스트 헤더를 다시 작성하는 사이에 펑키 프록시가있는 경우이 작업도 수행되지 않습니다.
2013 년 7 월 30 일 업데이트
아래 주석에서 @KevinJones가 언급했듯이 다음 섹션에서 언급 한 설정은 여기에 문서화되어 있습니다. http://msdn.Microsoft.com/en-us/library/hh975440.aspx
내가 그것을 시도했을 때 나는 그것을 얻을 수 없다고 말해야 만하지만, 오타 나 뭔가를 만들 수있다.
2012 년 7 월 9 일 업데이트
나는 조금 전에 이것을 보았고,이 대답을 업데이트하려고했지만 결코 그렇게하지 않았습니다. upvote가 방금이 대답에 들어 왔을 때 나는 지금해야한다고 생각했습니다.
Asp.Net에서 언급 한 '버그'는 분명히 문서화되지 않은 appSettings 값 ('aspnet:UseHostHeaderForRequest'
- 즉)으로 제어 될 수 있습니다.
<appSettings>
<add key="aspnet:UseHostHeaderForRequest" value="true" />
</appSettings>
나는 ILSpy에서 HttpRequest.Url
를 보면서 이것을 보았습니다 - ILSpy보기에서 다음 복사/붙여 넣기의 왼쪽에있는 --->
로 표시했습니다 :
public Uri Url
{
get
{
if (this._url == null && this._wr != null)
{
string text = this.QueryStringText;
if (!string.IsNullOrEmpty(text))
{
text = "?" + HttpEncoder.CollapsePercentUFromStringInternal(text,
this.QueryStringEncoding);
}
---> if (AppSettings.UseHostHeaderForRequestUrl)
{
string knownRequestHeader = this._wr.GetKnownRequestHeader(28);
try
{
if (!string.IsNullOrEmpty(knownRequestHeader))
{
this._url = new Uri(string.Concat(new string[]
{
this._wr.GetProtocol(),
"://",
knownRequestHeader,
this.Path,
text
}));
}
}
catch (UriFormatException)
{ }
}
if (this._url == null) { /* build from server name and port */
...
저는 개인적으로 그것을 사용하지 않았습니다 - 문서화되지 않았으므로 주위에 붙어있을 수는 없습니다 -하지만 위에서 언급 한 것과 같은 일을 할 수도 있습니다. 검색 결과에서 관련성을 높이고 이것을 발견 한 것으로 보이는 다른 사람을 인정하기 위해 'aspnet:UseHostHeaderForRequest'
설정은 Nick Aceves가 트위터에 언급했습니다
public static string GetCurrentWebsiteRoot()
{
return HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority);
}
Request.Url.PathAndQuery
완벽하게 작동해야합니다. 특히 우 리만 상대하기를 원한다면 (그러나 쿼리 스트링은 계속 유지해야합니다)
나도 페이스 북의 이유로 이것을 찾고 있었고, 지금까지 주어진 답변 중 아무 것도 필요에 따라 일하지 않았거나 너무 복잡합니다.
@Request.Url.GetLeftPart(UriPartial.Path)
쿼리 문자열을 "사용하지 않고"전체 프로토콜, 호스트 및 경로를 가져옵니다. 또한 기본값 80 이외의 값을 사용하는 경우 포트가 포함됩니다.
내가 좋아하는 것...
Url.Content(Request.Url.PathAndQuery)
아니면 ...
Url.Action()
다른 답변에서 언급되지 않은 한 가지는 여러 위치에서 참조 될 경우 대/소문자 구분입니다 (이 질문은 원래의 질문에는 없지만이 질문은 유사한 검색에서 많이 나타납니다). ). 다른 답변을 바탕으로 나는 다음과 같은 것들이 처음에는 나를 위해 일한다는 것을 발견했다.
Request.Url.AbsoluteUri.ToString()
그러나 더 신뢰할 수있게하기 위해 다음이되었습니다 :
Request.Url.AbsoluteUri.ToString().ToLower()
그리고 나서 내 요구 사항 (사이트가 어떤 도메인 이름에서 액세스되고 있는지 확인하고 관련 콘텐츠를 표시) :
Request.Url.AbsoluteUri.ToString().ToLower().Contains("xxxx")
브라우저 기록의 사례 (단일 페이지 스타일)
HttpContext.Request.UrlReferrer
내게는 HTTPContext
이 아직 준비되지 않은 동안 Controller 생성자에서 HTTPContext
에 액세스하려고 시도했을 때 문제가 발생했습니다. Index 메서드 내에서 이동하면 다음과 같이 작동합니다.
var uri = new Uri(Request.Url.AbsoluteUri);
url = uri.Scheme + "://" + uri.Host + "/";enter code here