在中间使用代理提取请求URI

时间:2011-08-15 02:12:29

标签: asp.net https http-headers

我正在开发一个Web应用程序,它需要向用户发送电子邮件,指示他们浏览到作为原始应用程序一部分的某些页面。我当前生成锚点href的代码如下:

String.Format("{0}{1}{2}{3}/{4}",
    Request.Url.Scheme, Uri.SchemeDelimiter, Request.Url.Host, 
    Request.ApplicationPath, path);

目标是无论我是在开发服务器,测试服务器还是生产服务器上运行站点,它都能正常工作并链接到正确的站点。但是,有一些缺点,我正在寻找一些帮助解决。

  1. Request.Url.Scheme对我们来说不适用于所有情况。我们的生产服务器需要https连接。代理捕获https连接,解密请求并将其转发到我们的Web服务器上。因此,Request.Url.Scheme将始终显示http
  2. Request.Url.Host返回生产服务器的本地服务器名称;我认为这也与代理问题有关。
  3. 已阅读其他帖子,建议改用Request.Headers["host"]。不确定这是否会遇到同样的问题。
  4. 是否有人对HTTP / HTTPS,转发和ASP.Net处理这个危险的代码有了更多的了解(或者可以指向正确的方向)?

    基本上,如果用户使用http从dev.example.com上的服务器收到电子邮件,则电子邮件中的Uri应为http://dev.example.com/page.aspx。如果用户通过https(由Web代理处理)使用生产服务器secure.example.com,则链接应为https://secure.example.com/page.asx

1 个答案:

答案 0 :(得分:2)

根据我处理单点登录实现的经验,我们的代理没有提供有关原始请求的任何信息。我们找不到解决https问题的方法,这是不幸的。

我不是100%,但我认为应用程序请求路由包可能允许重写html中的返回URL以在代理之外工作。例如。如果您将其作为http://server.com/page.aspx返回,则可能会将其重写为https://server.com/page.aspx。此外,您可以指定将我认为的代理服务器上的http连接升级到https的规则。因此,您将有一个初始http请求跳转到https。

此外,您可能希望您的开发服务器尽可能地与您的prod服务器一起工作以解决这些问题。