【问题标题】:respond to .html extensions响应 .html 扩展名
【发布时间】:2014-10-27 08:01:43
【问题描述】:

我正在将一个网站从静态网站迁移到 MVC 5。我需要创建控制器/操作来响应带有旧 URL 的请求。 (并返回重定向,页面已移动)如果我只是在属性路由中对旧 URL 进行硬编码,我会得到

HTTP 错误 404.0 - 未找到您要查找的资源已被删除、更改名称或暂时不可用

解决此问题的最佳方法是什么。 (我的意思是我如何为带有 .html 扩展名的 url 创建路由,并且 ASP.net 会响应它) 我认为现在 IIS 看到该 .html 并尝试将文件发送到客户端而不通过应用程序。我怎样才能消除共享主机上的这种行为?

现在提供的 html 文件位于不同的文件夹中。

示例:

我需要将此 URL 映射到控制器/操作:

example.com/services/Renovations.html

我们会将其映射到控制器 => 服务和操作 => 改造

example.com/contactus.html

我们将把它映射到控制器 => 联系人和操作 => 索引

【问题讨论】:

    标签: c# asp.net-mvc iis


    【解决方案1】:

    使用适合您的新架构的 MVC 控制器/操作编写您的应用程序,然后在 IIS 级别实现一组 URL Rewrite 规则以将旧 URL 映射到新 URL。重写规则将存储在您的 web.config 文件中,该文件便于将配置从 Dev 转移到 Staging 到 Live 环境。

    如果您提供一些旧 URL 及其新对应路由的示例,我可以为您提供一些示例 IIS 重写规则以进行匹配。如果您的旧 URL 遵循某种模式,这将最有效,例如/products/{skucode}.html

    编辑:一些示例重写规则以匹配请求的重定向。

    <configuration>
    <system.webServer>
      <rewrite>
        <rules>
          <clear />
          <rule name="Static rewrites" enabled="true" stopProcessing="true" >
            <match url="^(.*?\.html)$" />
            <conditions logicalGrouping="MatchAll" trackAllCaptures="false" />
            <action type="Redirect" url="{static site rewrites:{R:1}}" appendQueryString="true" />
          </rule>
        </rules>
        <rewriteMaps>
          <rewriteMap name="Static site rewrites" ignoreCase="true">
            <add key="contact.html" value="contact" />
            <add key="services/renovations.html" value="services/renovations" />
          </rewriteMap>
        </rewriteMaps>
      </rewrite>
    </system.webServer>
    </configuration>
    

    应该清楚如何为您希望重定向的其他页面向rewriteMap 添加更多键。澄清一下,这些是重定向,会向浏览器返回 HTTP 301 Moved Permanently 响应代码,并透明地将其重定向到新路由。

    【讨论】:

    • 谢谢@tianvh,例如我要更改的两条路线是: /Services/Renovation.html 到 /Services/Renovation /Contact.html 到 /Contact
    • @BenjaminWeblySpeaking.ca 我已经编辑了我的答案来解决这些例子。
    • 感谢您的澄清。我实际上是要重定向到控制器,然后实现 301 重定向。
    • 如果您希望进行 URL 重写而不是重定向,则在 IIS 级别执行此操作可以轻松更改。这样,您的客户仍将在其地址栏中看到contact.html,但现在从新的 MVC 控制器获取内容。为此,只需将 rule 更改为 &lt;action type="Rewrite" ...
    • 您提到的规则在我们的开发服务器上运行良好。我们遇到的唯一问题是我们的客户端在共享主机上运行,​​他们不允许通配符重定向。所以我不得不为每一页写规则。幸运的是,我们只有 7 页要重写。这是我使用的一条规则的示例,它有效。例如&lt;rule name="AboutRedirect" enabled="true" stopProcessing="true"&gt; &lt;match url="^aboutus.html$"/&gt; &lt;action type="Redirect" url="http://www.example.com/AboutUs" /&gt; &lt;/rule&gt;
    猜你喜欢
    • 1970-01-01
    • 2016-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多