我对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模块处于活动状态,并且可以正确处理其他代理请求。
为透明起见,假设某个Web机器人请求http://mysitedomain/sitemap.xml和实际请求将由http://sitemap.mysitedomain/provider?key=sitemap.xml提供,其中sitemap.mysitedomain托管在不同的服务器和不同的环境中。>
这里的奇怪之处在于,如果我将空的sitemap.xml放在mysitedomain的根目录中,则所有对sitemap.xml的请求都按预期开始工作,并且我开始从sitemap服务中获取更新的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获得了实际数据。
答案 0 :(得分:0)
我已经找到了发生这种情况的原因,并且对于Url Rewrite或ARR模块而言这不是问题。主要原因是ASP.Net处理此类请求并返回404,因为没有定义用于处理此类路径的路由。
为解决此问题,我们为站点地图网址添加了忽略定义
routes.IgnoreRoute("sitemap.xml");
routes.IgnoreRoute("sitemap/{*pathInfo}");