我对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,真正的请求将从站点map.mysitedomain托管在不同服务器和不同环境中的 http://sitemap.mysitedomain/provider?key=sitemap.xml 提供服务。
奇怪的是,如果我把空的站点地图.xml放在mysitedomain的根目录上,我对站点地图的所有请求.xml开始按预期工作,我开始从站点地图服务获取更新的站点地图.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)
我应该再次指出,如果我将一个空的站点地图.xml放在mysitedomain的根目录上,那么所有站点地图都会按预期开始工作。我从sitemap.mysitedomain获得了实际数据。
我已经找到了为什么会发生这种情况,这不是 Url 重写或 ARR 模块的问题。主要原因是 ASP.Net 处理此类请求并返回 404,因为没有定义用于处理此类路径的路由。
为了解决此问题,我们添加了站点地图网址的忽略定义
routes.IgnoreRoute("sitemap.xml");
routes.IgnoreRoute("sitemap/{*pathInfo}");