0

我正在使用 web.config 使用 .Net Core 设置一些重定向规则。

<rule name="About Page" stopProcessing="true">
    <match url="about.aspx" />
        <action type="Redirect" url="/Home/About" redirectType="Permanent" />
</rule>
...

因此,如果用户输入www.test.com/about.aspx,它会重定向到www.test.com/Home/About页面。

我的问题是如何将用户在 URL 中输入的内容传递给控制器​​方法?例如,在这种情况下, www.test.com /about.aspx?

我试过了

var currentURI = new Uri($"{Request.Scheme}://{Request.Host}{Request.Path}{Request.QueryString}");

但是那个检测到重定向的uri(www.test.com/Home/About),而不是最初输入的URL(www.test.com/about.aspx)

我在HomeController,IActionResult About方法中使用下面的代码。

using (HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Head, uri))

HttpRequestMessagerequestUri参数目前不是动态的,因此它无法检测到用户在 URL 中输入的内容。

帮助表示赞赏。

4

1 回答 1

1

为了更清楚,让我们描述一下 HTTP 请求的流程:

  1. HTTP 客户端发送初始请求到http://www.test.com/about.aspx
  2. 您的重定向规则命中并且服务器使用 301 代码和 http://www.test.com/Home/AboutLocation 标头中的重定向 URL 进行响应。
  3. HTTP 客户端收到此响应并意识到它应该使用新 URL 重新发送请求
  4. HTTP 客户端向新 URL 发送第二个请求http://www.test.com/Home/About

第二个请求不包含对原始 url 的任何引用http://www.test.com/about.aspx。这就是为什么您无法在服务器端获取原始网址的原因。

如果您的应用程序逻辑需要有关初始 url 的信息,我在这里看到两个选项:

  1. 您可以将原始 url 作为参数添加到重定向的 url,如下所示: http://www.test.com/Home/About?orig_url=http://www.test.com/about.aspx

    您必须使用新模板更新重定向规则,并在 ASP.Net Core 应用程序中调整路由。

  2. 您可以使用路由而不是重定向。在这种情况下,不会发生 301 重定向,服务器将使用用户键入的 url 处理初始请求,但将为两个 url 调用相同的控制器操作。

选择更适合您的方法。希望这会有所帮助。

于 2017-12-15T08:37:58.613 回答