【问题标题】:Redirect to external URI, even if it's not valid重定向到外部 URI,即使它无效
【发布时间】:2016-12-30 22:21:20
【问题描述】:

一般信息:

我正在开发一个 ASP.NET MVC 5 应用程序,该应用程序发送电子邮件并跟踪每封电子邮件中的链接点击。当一些用户点击链接时,他们使用某些查询参数对我的 Web 服务器执行 GET 查询。同时,我的应用程序保存有关点击的信息并将用户重定向到初始(目标)站点。

言归正传:

邮件中的链接可能是任意的(例如 http://www.google.com//google.comwww.google.com)或甚至无效(例如ab//cd)。我的应用程序不关心 url 的字符串值(即使它类似于 \asdf//sadg:),只会将它们直接粘贴到地址栏。

为此,我尝试使用RedirectRedirectPermanent 方法以及UriBuilder 类。 RedirectRedirectPermanent 可能会组合地址并尝试重定向到本地路径,如果 url 没有指定方案。 UriBuilder 会根据需要添加一个方案,但是当 url 无效时会抛出异常。顺便说一句,JavaScript location.replace 与 c# Redirect 具有相同的行为。

问题:

如何在没有任何验证的情况下从我的 ASP.NET MVC 控制器重定向到任意 url 并重定向到本地路径?

【问题讨论】:

  • 只是为了验证:您确实了解重定向需要有效的 url,而地址栏实际上实际上是在几个可能的选项上执行搜索以找到有效的 url...所以您需要决定您计划实施哪一个并且实际上需要帮助。
  • 顺便说一句,我无法想象你为什么要这样做......
  • @DannyChen,您使用过 MailChimp 服务吗?在这种情况下,我的应用程序的工作方式非常相似。用户可以自己编写html格式的字母并粘贴普通链接(例如'abc')。发送时,该应用会用 example.com/?target=//abc 之类的东西替换主 URL。充其量,用户甚至不会注意到我的应用程序的干预。因此,我不应该更改链接或重定向到本地错误页面,即使它们是无效的。
  • @Alexei,当然。我正在寻找一种将网址直接粘贴到地址栏中的方法。例如,当我输入 aaaa/aa 时,我的浏览器显示“无法访问此站点”。我的应用以同样的方式工作。

标签: c# asp.net-mvc


【解决方案1】:

您应该能够使用 Redirect() 方法并且只需传入一个字符串。我认为它不会尝试验证给定的 URI,只要您将其作为字符串传递。

测试并“工作”(浏览器收到正确的位置标头):

return Redirect("\asdf//sadg:");

如果您想“手动”执行此操作,您可以执行以下操作来自己执行重定向:

    Response.AddHeader("Location","whateverurl");           
    HttpContext.Response.StatusCode = (int)HttpStatusCode.Moved;
    return new ContentResult() { Content = String.Empty };  

【讨论】:

  • 你误会了,它不应该重定向到本地页面并附加一些标题。我已经为@DannyChen 更广泛地描述了这种情况。我还测试了'return Redirect(@"\asdf//sadg:")',它会打开像 example.com/asdf/sadg: 这样的本地页面。
猜你喜欢
  • 2022-08-08
  • 2014-10-03
  • 2016-01-20
  • 1970-01-01
  • 2018-08-14
  • 2021-02-07
  • 2021-03-12
  • 2020-07-16
  • 2013-11-01
相关资源
最近更新 更多