1

我编写了附加在 BeginRequest 上的 httpModule 来处理 SEO URL 转换和 301 重定向。大多数事情都可以通过 URL 重写来完成,但我想要一个更灵活的选项,并且 URL 重写会为每个转换发出多个重定向(添加“www”是重定向,切换到小写 URL 是另一个,添加尾随“ /” 另一个等等...),而我的 httpModule 检查所有条件(包括 http/https,如果页面必须是安全的),转换 URL,然后执行单个 301 重定向。

我面临的问题是……似乎 IIS 7.5 在请求http://www.example.com/mydir/时会在 http://www.example.com/mydir/default 内部进行转换。 aspx并且这会触发我的模块的无限循环,该模块试图删除“default.aspx”部分并永久重定向到http://www.example.com/mydir/

在我的模块中 BeginRequest 发生的事情非常简单。对于每个请求,我调用一个函数 CheckRedirects() 来检查所有规则,如果不需要重定向,则返回一个空字符串,如果需要执行重定向,则返回经过清理的 url。

我不知道哪个默认模块执行此“内部”重定向,这实际上不是真正的重定向,因为如果您在访问http://www.example.com/mydir/时检查网络上发生的情况,则没有重定向到http://www.example.com/mydir/default.aspx,所以只是一种“内部”重定向,但是它弄乱了我的模块,创建了一个无限循环

我访问当前的请求 URL

Dim request As HttpRequest = HttpContext.Current.Request
Dim url As System.Uri = request.Url

编辑:作为旁注,如果我使用 URL Rewrite 2.0 模块进行相同的重定向,则不会触发无限循环。这让我认为 URL Rewrite 2.0 模块在 IIS 模块链中,在执行内部“default.aspx”模块之前。URL 重写的规则是:

<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://example.com/defaultp.aspx 这将最终得到 2 个重定向,一个从 URL 重写模块中删除“default.aspx”,然后从我的自定义 HttpModule 中删除另一个将添加“www”的模块。

4

0 回答 0