【问题标题】:C# .NET 301 redirect to file, not controllerC# .NET 301 重定向到文件,而不是控制器
【发布时间】:2014-01-27 21:13:46
【问题描述】:

从另一个线程上的this answer,我创建了一个重定向控制器来将我的旧 aspx 文件路由到我的新 MVC 页面。

RouteConfig.cs:

routes.MapRoute(
    name: "About",
    url: "aboutus.aspx",
    defaults: new { controller = "Redirect", action = "About" }
);

RedirectController.cs:

public ActionResult About()
{
    return RedirectPermanent("/Home/About");
}

这很有效,因为我在/Views/Home/About.cshtml 中有一个视图。但是,如果我尝试重定向,比如说一个 .PDF 文件,它就不起作用...

RouteConfig.cs:

routes.MapRoute(
    name: "MyPDF",
    url: "somefile.pdf",
    defaults: new { controller = "Redirect", action = "MyPDF" }
);

RedirectController.cs:

public ActionResult MyPDF()
{
    return RedirectPermanent("/Documents/somefile.pdf");
}

这会转到标准的 404 未找到页面。我也尝试过没有运气的绝对路径:

RedirectController.cs:

public ActionResult MyPDF()
{
    return RedirectPermanent("http://mydomain.com/Documents/somefile.pdf");
}

但仍然没有运气。有什么想法吗?

编辑:重定向的原因是因为第 3 方网站链接到旧的 PDF 文件(它们曾经存在于网站根目录,现在它们位于 /Documents/。我想 301 重定向到正确的文件。

【问题讨论】:

  • 这是因为 ASP.MVC 不理解带有句点的 URL。默认情况下,IIS 会控制这些请求并尝试查找实际文件。我不确定如何解决它。

标签: c# asp.net-mvc redirect asp.net-mvc-routing


【解决方案1】:

为什么要重定向到文件?你能不能只在视图中将该文件的 url 提供给用户?

如果你坚持重定向,那就去吧:

return Redirect("~/Documents/myPdf.pdf");

但请确保那里有 Documents 文件夹和 myPdf.pdf 文件。并且您必须没有 Documents 控制器,否则它将无法正常工作。或者您需要通过向路由表添加另一条路由来解决它。

【讨论】:

  • 一个原因是记录静态文件下载(以额外的 HTTP 重定向请求为代价)。
  • 永不结束!谢谢,西蒙
  • 我希望重定向的原因是因为第三方网站链接到旧的 PDF 文件。所以我想 301 重定向到正确的文件。我试过你的建议'return Redirect("~/Documents/myPdf.pdf");'但仍然没有运气。
  • 听起来你只需要 IIS iis.net/learn/extensions/url-rewrite-module/…中的重写规则@
【解决方案2】:

您应该在路由配置中添加以下内容:

routes.IgnoreRoute("{*pdfExtension}", new {pdfExtension=@".*\.pdf(/.*)?"});

如果您想忽略 PDF 文件扩展名,并能够在 URL 中使用此类扩展名时重定向到正常操作。

【讨论】:

    【解决方案3】:
    routes.MapRoute(
        name: "MyPDF",
        url: "somefile.pdf",
        defaults: new { controller = "Redirect", action = "MyPDF" }
    );
    
    public ActionResult MyPdf()
            {
                return Redirect("http://www.myvlkbenefits.com/MedicalSummary.pdf");
            }
    

    http://localhost/somefile.pdf -> 重定向到 -> 上面的那个

    您的代码没有问题,可能您的 url 与您在浏览器上输入的不一样,因此给您 404

    【讨论】:

      【解决方案4】:

      如果您只想返回文档,那么使用控制器上的File() 方法返回文件会不会更有意义。

      它不需要重定向,只需要你有一个物理文件位置。

      对不起,如果我误解了问题和答案的格式,它来自我的手机。

      here是链接

      【讨论】:

      • 谢谢。我必须运行,但明天我会看看 File() 方法。为了澄清,我想重定向,因为第 3 方网站链接到旧的和不正确的 PDF 路径。
      • 如果 PDF 文件存储在您的本地网络服务器上并且您可以访问它们,那么文件操作结果将为您工作。我在答案中添加了链接
      【解决方案5】:

      对于重定向 PDF,我建议在 Web.config 中使用重写规则,而不是 MVC 控制器和 RouteConfig.cs。它可能看起来像这样:

      在 Web.config 中的 system.webServer 内

      <rewrite>
        <rules>
          <rule name="Permanent Redirect Rule" stopProcessing="true">
            <match url=".*" />
            <conditions>
              <add input="{PermanentRedirects:{REQUEST_URI}}" pattern="(.+)" />
            </conditions>
            <action type="Redirect" url="{C:1}" appendQueryString="false" redirectType="Permanent" />
          </rule>
        </rules>
        <rewriteMaps>
          <rewriteMap name="PermanentRedirects">
            <add key="/somefile.pdf" value="/Documents/newfile.pdf"/>
          </rewriteMap>
        </rewriteMaps>
      </rewrite>
      

      rewriteMap 部分添加add 行,以便每个要重定向的PDF。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-04-12
        • 2020-04-28
        • 2014-06-02
        • 1970-01-01
        • 2018-04-12
        • 2015-02-22
        • 2013-03-09
        • 1970-01-01
        相关资源
        最近更新 更多