iis - 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 获得了实际数据。
解决方案
我已经找到了它发生的原因,并且这不是 Url Rewrite 或 ARR 模块的问题。主要原因是 ASP.Net 处理此类请求并返回 404,因为没有定义路由来处理此类路径。
为了解决这个问题,我们添加了站点地图 url 的忽略定义
routes.IgnoreRoute("sitemap.xml");
routes.IgnoreRoute("sitemap/{*pathInfo}");
推荐阅读
- ruby-on-rails - ruby on rails 匿名删除记录用户名
- javascript - 我可以拥有带有边缘交互和填充的 SVG 多边形吗
- curl - 如何在 curl API 中传递变量?
- netty - Netty4:IdleStateHandler 不会在 EmbeddedChannel 中触发事件
- android - 如何全屏显示微调器下拉菜单?
- vaadin - 使用 Metawidget 和 Vaadin 获取 java.lang.NoClassDefFoundError: com/vaadin/data/Property
- c++ - 将鼠标和键盘输入发送到 unity3d 游戏 (Rust)
- asp.net-mvc - 使用 WebApi 在 Angular 中进行 CRUD 操作
- unit-testing - mlUnitTest 不适用于 MarkLogic 单元测试
- laravel - 如何路由动态网址?