我在BeginRequest上编写了我的httpModule来处理SEO url转换和301重定向。大多数事情可以通过Url Rewrite来完成,但我想要一个更灵活的选项,而且Url Rewrite会为每个转换发出多个重定向(添加“www”是重定向,切换到小写url是另一个,添加尾随“ /“另一个等等......”虽然我的httpModule检查所有条件(如果页面必须是安全的,包括http / https),转换网址,然后执行单个301重定向。
我面临的问题是......似乎IIS 7.5根据http://www.mysite.com/mydir/的请求在http://www.mysite.com/mydir/default.aspx内部进行了转换,这触发了我的模块的无限循环,试图删除“default.aspx”部分并永久重定向到http://www.mysite.com/mydir/
我的模块中的BeginRequest会发生什么变化非常简单。对于每个请求,我调用一个函数CheckRedirects(),它检查所有规则,如果不需要重定向则返回空字符串,如果有重定向要执行,则返回已清理的URL。
我不知道默认模块是否进行了这种“内部”重定向,实际上并不是真正的重定向,因为当你去http://www.mysite.com/mydir/检查网络上发生了什么时,没有重定向到{{ 3}},所以只是一种“内部”重定向,但它让我的模块陷入困境,造成无限循环
我使用
访问当前请求网址Dim request As HttpRequest = HttpContext.Current.Request
Dim url As System.Uri = request.Url
提前感谢您的支持。
编辑:作为旁注,如果我使用Url Rewrite 2.0模块进行相同的重定向,则不会触发无限循环。这使我认为在执行内部“default.aspx”模块之前,Url Rewrite 2.0模块在IIS模块链中。 Url Rewrite的规则是:
<system.webServer>
<rewrite>
<rules>
<rule name="Default Document" stopProcessing="true">
<match url="(.*)default.aspx" />
<action type="Redirect" url="{R:1}" redirectType="Permanent" />
</rule>
</rules>
</rewrite>
</system.webServer>
问题是,如果我混合Url Rewrite和我的自定义HttpModule,我最终会有多个重定向相同...只考虑一个简单的场景http://www.mysite.com/mydir/default.aspx 最终会有2个重定向,一个来自Url Rewrite模块,它将删除“default.aspx”,然后从我的自定义HttpModule中添加另一个将添加“www。”