ASP.NET:使用自定义SEO重定向HttpModule重定向循环

时间:2013-03-19 13:53:32

标签: asp.net redirect http-status-code-301 infinite-loop httpmodule

我在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。”

0 个答案:

没有答案