【问题标题】:IIS URL rewrite not working, the input URL not even captured?IIS URL 重写不起作用,甚至没有捕获输入 URL?
【发布时间】:2020-09-16 14:37:02
【问题描述】:

失败的请求跟踪可以很好地记录失败的重写。我可以查看日志文件,至少可以理解为什么重写不起作用。

正则表达式模式已通过匹配测试 OK,但我在浏览器中输入的输入 URL 甚至没有被捕获。所有映射到控制器操作的 URL 都被捕获(我的网站是一个 ASP.NET MVC 应用程序)但是我需要重写的 URL 没有映射到任何,页面显示 404。但我希望它被重写为一些工作 URL (为了测试它,而不是显示 404,它应该被重写到目标 url 并显示从那里返回的内容)。

我的 URL 重写规则使用 Reverse Proxy 模板。

我希望我在这里的理解是正确的。我该如何诊断?我的目的只是通过捕获通过我的网站的所有请求来将 IIS 转换为反向代理,在请求重写的 URL 并将内容返回给原始客户端之前检查是否有任何匹配定义的正则表达式模式。

更新

对于那些可能不了解 ASP.NET MVC 的人:

假设我的网站有一个名为HomeController 的控制器,其动作为Index,映射到它的URL 是/Home/Index

我的意思是未映射到任何操作的网址可能是/Home/TestProxy 这里HomeController 没有公开任何操作TestProxy,也没有任何路由规则映射/Home/TestProxy 到任何操作。所以在这种情况下,ASP.NET MVC 应用程序将显示一个404 页面。

如上所述,对于映射到有效控制器操作的 URL,它们似乎被捕获并视为输入 URL(在根据重写规则进行检查之前)。但是对于未映射到任何控制器操作的 URL(显示 404),我看不到任何记录为输入 URL(因此,它们当然不会根据重写规则进行检查,也不会起作用)。

更新 2

实际上,我测试的 URL 甚至没有映射到控制器,所以看起来它没有被我设置的 Failed Requests Tracing 规则记录。现在我尝试使用映射到控制器但没有映射到任何操作的 URL(它仍然显示 404)但成功地被 Failed Request Tracing 规则记录。我可以在日志文件中看到这一点:

<EventData>
   <Data Name="ContextId">{80000034-0000-F000-B63F-84710C7967BB}</Data>
   <Data Name="Pattern">testproxy/(.*)</Data>
   <Data Name="Input">home/testproxy/index</Data>
   <Data Name="Negate">false</Data>
   <Data Name="Matched">true</Data>
</EventData>

所以它报告了matched 模式,但页面仍然显示 404,而我希望它从重写的 url 返回内容(应该是http://10.0.0.5/index - 我确认如果直接请求这个 URL 有效,它是只是本地网络上另一个简单的发布网站)。我什至不知道现在这是否可能,或者我在这里做错了什么。

【问题讨论】:

  • 请记住,这里没有人可以看到您的屏幕,所以当您谈到“我需要重写的 URL 没有映射到任何”时,请显示(屏幕截图、视频或任何合适的) .如果出现常见错误,您还应该显示规则。
  • @LexLi 我的意思是 URL 没有映射到任何 控制器操作,这不是很清楚吗?在这种情况下,我的网站显示 404。我认为在这种情况下不需要具体说明
  • @LexLi 请参阅我上面的更新部分,如果您对这个问题投了反对票,请考虑删除您的投票,谢谢!

标签: asp.net-mvc iis proxy url-rewriting reverse-proxy


【解决方案1】:

URL 重写入站规则在控制器操作之前执行。如果您可以在失败的请求跟踪日志中发布完整的错误消息,我们将不胜感激。

如果请求http://10.0.0.5/index但从IIS返回404。听起来您的 ARR 代理根本没有启用。首先,请尝试禁用反向代理出站规则。然后进入IIS管理器->服务器节点->应用请求路由缓存->服务器代理设置->启用代理。

更新:

重写规则已经生效,请求似乎被停止了

[HttpException]:找不到路径“/questions/62078944/iis-url-rewrite-not-working-the-input-url-not-even-captured”的控制器或未实现 IController。 在 System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(RequestContext requestContext,类型 controllerType) 在 System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase httpContext,IController& 控制器,IControllerFactory& 工厂) 在 System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext,AsyncCallback 回调,对象状态) 在 System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 在 System.Web.HttpApplication.ExecuteStepImpl(IExecutionStep 步骤) 在 System.Web.HttpApplication.ExecuteStep(IExecutionStep 步骤,Boolean& completedSynchronously) -->"

【讨论】:

  • 现在我只能说Enable proxy 已检查,让我进一步检查并稍后回复您。同时,如果可能,请查看我上面的 UPDATE 2 部分,请求已记录,但 url 重写似乎仍然不起作用。您可能需要更多信息来诊断它,此时我只希望您能给我可能的后续步骤。感谢您的宝贵时间。
  • @Hopeless 请通过 IE 而不是 xml 格式打开失败的请求跟踪日志,并发布完整的重写部分和完整的错误消息。
  • 404请求没有被记录的最初原因是捕获的状态码设置错误(设置跟踪规则时)。我修改了它,现在请求记录正常。但是重写似乎不起作用。正如你所建议的,我已经尝试通过 IE 打开 xml 文件,发现没有报告任何消息,看起来像这样 No Errors or Warnings were found 当然还有很多关于请求的其他数据(在 Request Details 选项卡中)。
  • @Hopeless 请切换到紧凑视图并发布重写部分和模块返回错误。当然,如果您能分享日志,我们将不胜感激。
  • 我在日志中看到了一些pattern matchednew url written 的迹象,但仍然不确定为什么它没有返回到我的浏览器。我正在尝试将http://localhost:80/... 重写为http://stackoverflow.com/... 并希望它返回stackoverflow 页面。这是日志文件(压缩)sites.google.com/site/ngaodaantoi/files/…
猜你喜欢
  • 1970-01-01
  • 2013-07-26
  • 1970-01-01
  • 2015-01-29
  • 2015-10-20
  • 1970-01-01
  • 2012-12-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多