首页 > 解决方案 > IIS URL 重写和 ARR 不能正确处理重写规则

问题描述

我对 URL 重写和 ARR 如何协同工作有一些了解。我有一个站点和一个独立服务,可以为该站点生成并提供更新的站点地图。以下是我处理站点地图请求的规则。这是站点目录下 web.config 中的本地规则(该站点托管在 IIS 10 下)。

<rule name="Sitemap Rule" stopProcessing="true">
      <match url="^sitemap.*" />
      <action type="Rewrite" url="http://sitemap.mysitedomain/provider?key={R:0}" logRewrittenUrl="true" />
</rule>

一切看起来都很好,但它不起作用。我得到的唯一响应是 404。我应该注意 ARR 模块是活动的,它可以正确处理其他代理请求。

为了在这条规则上透明,假设一些网络机器人请求http://mysitedomain/sitemap.xml和真正的请求将来自http://sitemap.mysitedomain/provider?key=sitemap.xml其中 sitemap.mysitedomain托管在不同的服务器和不同的环境中。

这里奇怪的是,如果我将空的 sitemap.xml 放到 mysitedomain 的根目录中,我对 sitemap.xml 的所有请求都会按预期开始工作,并且我开始从站点地图服务获取更新的 sitemap.xml 和一个空的我已经放置到网站的根目录。


从失败的请求中添加了一些跟踪信息

对于失败的请求,我在跟踪文件中有下一个

...
ModuleName    RewriteModule

HeaderName    X-Original-URL 
HeaderValue   /sitemap.xml 
Replace       true 

OldUrl       /sitemap.xml 
NewUrl       http://sitemap.mysitedomain/v1/sitemap/provider?key=sitemap.xml

...

ModuleName            ApplicationRequestRouting 
Notification          MAP_REQUEST_HANDLER 
fIsPostNotification   false 
...
OldUrl                http://sitemap.laf24.ru/v1/sitemap/provider?key=sitemap.xml 
NewUrl                /sitemap.xml 

...

ModuleName            ManagedPipelineHandler 
Notification          EXECUTE_REQUEST_HANDLER 
HttpStatus            404 
HttpReason            Not Found 
HttpSubStatus         0 
ErrorCode             The operation completed successfully. (0x0) 

我应该再次指出,如果我将一个空的 sitemap.xml 放置到 mysitedomain 的根目录中,那么一切都会按预期开始工作。我从 sitemap.mysitedomain 获得了实际数据。

标签: iisurl-rewritingarr

解决方案


我已经找到了它发生的原因,并且这不是 Url Rewrite 或 ARR 模块的问题。主要原因是 ASP.Net 处理此类请求并返回 404,因为没有定义路由来处理此类路径。

为了解决这个问题,我们添加了站点地图 url 的忽略定义

routes.IgnoreRoute("sitemap.xml");
routes.IgnoreRoute("sitemap/{*pathInfo}");

推荐阅读