我正在开发一个Web应用程序,它需要向用户发送电子邮件,指示他们浏览到作为原始应用程序一部分的某些页面。我当前生成锚点href的代码如下:
String.Format("{0}{1}{2}{3}/{4}",
Request.Url.Scheme, Uri.SchemeDelimiter, Request.Url.Host,
Request.ApplicationPath, path);
目标是无论我是在开发服务器,测试服务器还是生产服务器上运行站点,它都能正常工作并链接到正确的站点。但是,有一些缺点,我正在寻找一些帮助解决。
Request.Url.Scheme
对我们来说不适用于所有情况。我们的生产服务器需要https连接。代理捕获https连接,解密请求并将其转发到我们的Web服务器上。因此,Request.Url.Scheme
将始终显示http
Request.Url.Host
返回生产服务器的本地服务器名称;我认为这也与代理问题有关。Request.Headers["host"]
。不确定这是否会遇到同样的问题。是否有人对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
。
答案 0 :(得分:2)
根据我处理单点登录实现的经验,我们的代理没有提供有关原始请求的任何信息。我们找不到解决https问题的方法,这是不幸的。
我不是100%,但我认为应用程序请求路由包可能允许重写html中的返回URL以在代理之外工作。例如。如果您将其作为http://server.com/page.aspx返回,则可能会将其重写为https://server.com/page.aspx。此外,您可以指定将我认为的代理服务器上的http连接升级到https的规则。因此,您将有一个初始http请求跳转到https。
此外,您可能希望您的开发服务器尽可能地与您的prod服务器一起工作以解决这些问题。