【问题标题】:Get the exact url the user typed into the browser获取用户在浏览器中输入的确切 url
【发布时间】:2010-10-19 23:00:18
【问题描述】:

我想获取用户在浏览器中输入的确切网址。当然,我总是可以使用Request.Url.ToString() 之类的东西,但这并不能在以下情况下给我我想要的东西:

http://www.mysite.com/rss

上面的网址Request.Url.ToString()会给我的是:

http://www.mysite.com/rss/Default.aspx

有谁知道如何做到这一点?

我已经试过了:

  • Request.Url
  • Request.RawUrl
  • this.Request.ServerVariables["CACHE_URL"]
  • this.Request.ServerVariables["HTTP_URL"]
  • ((HttpWorkerRequest)((IServiceProvider)HttpContext.Current).GetService(typeof(HttpWorkerRequest))).GetServerVariable( "CACHE_URL")
  • ((HttpWorkerRequest)((IServiceProvider)HttpContext.Current).GetService(typeof(HttpWorkerRequest))).GetServerVariable( "HTTP_URL")

【问题讨论】:

  • 如果您查看 Cassini 源代码,您会看到用户请求的 URL 在调用 HttpRuntime.ProcessRequest 之前被覆盖(在某些情况下)。这几乎排除了任何与 HttpWorkerRequest 无关的方式。

标签: c# asp.net url request


【解决方案1】:

有可能,您只需要结合请求对象中的一些值来重建输入的确切 url:

Dim pageUrl As String = String.Format("{0}://{1}{2}", 
    Request.Url.Scheme, 
    Request.Url.Host, 
    Request.RawUrl)

Response.Write(pageUrl)

输入地址http://yousite.com/?hello 准确返回:

http://yousite.com/?hello

【讨论】:

    【解决方案2】:

    尝试使用Request.Url.OriginalString 可能会给您想要的东西。

    【讨论】:

      【解决方案3】:

      最简单的方法是使用客户端编程来提取确切的 url:

      <script language="javascript" type="text/javascript"> 
      document.write (document.location.href); 
      </script>
      

      【讨论】:

        【解决方案4】:

        还请记住,“用户输入的确切 URL”可能永远不会在服务器上可用。从手指到服务器的链中的每个链接都可以稍微修改请求。

        例如,如果我在浏览器窗口中输入 xheo.com,IE 将自动转换为http://www.xheo.com。然后,当请求到达 IIS 时,它会告诉浏览器——你真的想要http://www.xheo.com/Default.aspx 的默认页面。所以浏览器通过询问默认页面来响应。

        HTTP 30x 重定向请求也会发生同样的情况。服务器可能只会看到浏览器发出的最终请求。

        【讨论】:

        • 可以理解。我不太关心用户输入的 http:// 或 www 部分。我的主要目标是了解他们是否输入了 mysite.com/rss 或 mysite.com/rss/default.aspx
        • 默认文档(在 IIS 上)在服务器内部处理,而不是通过客户端重定向。这仅适用于不以 / 结尾的目录名称
        • 我希望最初请求的网址在某个地方可用...您是说您不这么认为吗? IIS 必须在某个时候拥有它,这样它才能知道要提供什么默认文档?
        • 您能解释一下为什么需要区分 rss/ 和 rss/default.aspx 吗?实际上,它们是相同的。我确信有充分的理由,但理解它可能有助于找到更好的解决方案。
        • 通常这种请求是出于 SEO 目的:请为每个页面只显示 1 个 URL,而不是两个或三个 - 默认文档显然是 SEO 顾问生活的祸根。
        【解决方案5】:
        Request.RawUrl
        

        我想是你追的那只猴子……

        【讨论】:

        • 不,这也是我的第一个建议(从那以后我把它删掉了)。
        【解决方案6】:

        编辑:您需要带有键 HTTP_URLCACHE_URLHttpWorkerRequest.GetServerVariable()。请注意,IIS 5 和 IIS 6 之间的行为不同(请参阅密钥文档)。

        为了能够访问所有服务器变量(万一你得到null),直接访问HttpWorkerRequest:

        HttpWorkerRequest workerRequest = 
          (HttpWorkerRequest)((IServiceProvider)HttpContext.Current)
          .GetService(typeof(HttpWorkerRequest)); 
        

        【讨论】:

        • 不工作。得到了 null :( 我试过 ((HttpWorkerRequest)((IServiceProvider)HttpContext.Current).GetService(typeof(HttpWorkerRequest))).GetServerVariable( "CACHE_URL" ) 和 ((HttpWorkerRequest)((IServiceProvider)HttpContext.Current).GetService( typeof(HttpWorkerRequest))).GetServerVariable("HTTP_URL")
        • 你的平台是什么?也许不是 IIS?
        • 我目前正在本地工作站上进行开发(VS 2008 sp 1、.net 3.5 sp1、Win XP、IE7、IIS 5.1)
        • 它是“URL”,而不是“HTTP_URL”,但是当浏览器只请求一个目录时,cassini 和 IIS 7 都会返回包含文件名的完整路径。我没有在 IIS 6 上检查过 - 你使用的是哪个版本的 Lucero?
        • 嗯,对不起,我的立场是正确的 - 我正在迭代集合。但是,HTTP_URL 返回与 URL 相同的结果。在 IIS 7 上似乎对我有用的是 Request.ServerVariables["CACHE_URL"] 但这会为我返回:mysite.com:80/rss(即带有端口号)。
        猜你喜欢
        • 2012-10-16
        • 1970-01-01
        • 2013-07-04
        • 2019-04-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-23
        相关资源
        最近更新 更多