URL中的点导致404使用ASP.NET mvc和IIS

问题描述 投票:288回答:17

我有一个项目,要求我的URL在路径中有点。例如,我可能有一个URL,例如www.example.com/people/michael.phelps

带点的网址生成404.我的路由很好。如果我通过michaelphelps,没有圆点,那么一切正常。如果我添加点我得到404错误。示例站点在带有IIS8 Express的Windows 7上运行。 URLScan未运行。

我尝试将以下内容添加到我的web.config中:

<security>
  <requestFiltering allowDoubleEscaping="true"/>
</security>

不幸的是,没有什么区别。我刚收到404.0 Not Found错误。

这是一个MVC4项目,但我不认为这是相关的。我的路由工作正常,我期望的参数在那里,直到它们包含一个点。

我需要配置什么才能在网址中加点?

asp.net-mvc iis iis-7 iis-express iis-8
17个回答
365
投票

我通过编辑我的网站的HTTP处理程序来完成这项工作。为了我的需要,这很有效并解决了我的问题。

我只是添加了一个新的HTTP处理程序,用于查找特定的路径条件。如果请求匹配,则将其正确发送到.NET进行处理。对于URLRewrite破解或启用RAMMFAR的解决方案,我感到非常高兴。

例如,要让.NET处理URL www.example.com/people/michael.phelps,请将以下行添加到system.webServer / handlers元素中的站点web.config:

<add name="ApiURIs-ISAPI-Integrated-4.0"
     path="/people/*"
     verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS"
     type="System.Web.Handlers.TransferRequestHandler"
     preCondition="integratedMode,runtimeVersionv4.0" />

编辑

还有其他帖子暗示这个问题的解决方案是RAMMFARRunAllManagedModulesForAllRequests。启用此选项将为所有请求启用所有托管模块。这意味着静态文件(如图像,PDF和其他所有内容)将在不需要时由.NET处理。除非您有特定的案例,否则最好不要使用此选项。


1
投票

是否可以更改您的网址结构? 为了我正在努力,我尝试了一条路线

url: "Download/{fileName}"

但它失败了任何有一个。在里面。

我改变了路线

    routes.MapRoute(
        name: "Download",
        url:  "{fileName}/Download",
        defaults: new { controller = "Home", action = "Download", }
    );

现在我可以放入localhost:xxxxx/File1.doc/Download,它工作正常。

我在视图中的助手也接受了它

     @Html.ActionLink("click here", "Download", new { fileName = "File1.doc"})

它也链接到localhost:xxxxx/File1.doc/Download格式。

也许你可以在你的路线的末尾添加一个不需要的单词,如“/ view”或action,这样你的属性就可以以/的尾随/mike.smith/view结尾


1
投票

尝试了上面的所有解决方案,但没有一个适合我。我卸载.NET版本> 4.5的工作是什么,包括所有的多语言版本;最终我逐个添加了更新(仅英文版)的版本。现在我系统上安装的版本是这样的:

  • 2.0
  • 3.0
  • 3.5 4
  • 4.5
  • 4.5.1
  • 4.5.2
  • 4.6
  • 4.6.1

它仍然在这一点上工作。我害怕安装4.6.2,因为它可能会弄乱一切。

所以我只能推测4.6.2或所有那些非英文版本都搞乱了我的配置。

HTH有人。


1
投票

它就像改变路径=“。”一样简单。 to path =“”。只需删除web.config中ExensionlessUrlHandler-Integrated-4.0路径中的点。

这是一篇很好的文章https://weblog.west-wind.com/posts/2015/Nov/13/Serving-URLs-with-File-Extensions-in-an-ASPNET-MVC-Application


0
投票

我能够解决我的问题的特定版本(必须使用https://stackoverflow.com/a/13082446/1454265中的解决方案使/customer.html路由到/ customer,不允许使用斜杠),并替换path =“*。html”。


0
投票

因为解决方案也可以考虑编码为不包含symbol.的格式,如base64。

在js应该添加

btoa(parameter); 

在控制器中

byte[] bytes = Convert.FromBase64String(parameter);
string parameter= Encoding.UTF8.GetString(bytes);

0
投票

将URL重写规则添加到Web.config存档。您需要在IIS中安装URL Rewrite module。使用以下重写规则作为您自己的灵感。

<?xml version="1.0" encoding="utf-8"?>
<configuration>

<system.webServer>
  <rewrite>
    <rules>
      <rule name="Add trailing slash for some URLs" stopProcessing="true">
        <match url="^(.*(\.).+[^\/])$" />
          <conditions>
              <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
              <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
          </conditions>
          <action type="Redirect" url="{R:1}/" />
      </rule>
    </rules>
    </rewrite>
</system.webServer>

</configuration> 

0
投票

此外,(相关)检查处理程序映射的顺序。我们在其后面的路径中有一个带有.svc(例如/foo.asmx/bar.svc/path)的.ashx。 .svc映射首先是404,因为.svc路径在.asmx之前匹配。我没有想太多,但也许url编码路径会照顾这个。


-3
投票
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace WebApplication1.Controllers
{
    [RoutePrefix("File")]
    [Route("{action=index}")]
    public class FileController : Controller
    {
        // GET: File
        public ActionResult Index()
        {
            return View();
        }

        [AllowAnonymous]
        [Route("Image/{extension?}/{filename}")]
        public ActionResult Image(string extension, string filename)
        {
            var dir = Server.MapPath("/app_data/images");

            var path = Path.Combine(dir, filename+"."+ (extension!=null?    extension:"jpg"));
           // var extension = filename.Substring(0,filename.LastIndexOf("."));

            return base.File(path, "image/jpeg");
        }
    }
}

46
投票

经过一番探讨之后,我发现relaxUrlToFileSystemMapping对我来说根本不起作用,在我的情况下有效的是将RAMMFAR设置为true,同样适用于(.net 4.0 + mvc3)和(.net 4.5 + mvc4)。

<system.webserver>
    <modules runAllManagedModulesForAllRequests="true">

设置RAMMFAR时请注意真正的Hanselman post about RAMMFAR and performance


25
投票

我相信你必须在你的web.config中设置属性relaxedUrlToFileSystemMapping。 Haack不久前写了一篇关于这个的文章(还有一些其他SO posts提出相同类型的问题)

<system.web>
<httpRuntime relaxedUrlToFileSystemMapping="true" />

23
投票

很长一段时间我在这个问题上遇到了所有不同的补救措施而无济于事。

我注意到,当在包含点[。]的URL的末尾添加正斜杠[/]时,它没有抛出404错误,它实际上有效。

我终于使用像IIS URL Rewrite这样的URL重写器来解决问题,以监视特定模式并附加训练斜杠。

我的URL看起来像这样:/Contact/~firstname.lastname所以我的模式很简单:/Contact/~(.*[^/])$

我从Scott Forsyth那里得到了这个想法,请看下面的链接:http://weblogs.asp.net/owscott/handing-mvc-paths-with-dots-in-the-path


21
投票

只需将此部分添加到Web.config,即使pathInfo中有点,指定处理程序也将处理对路径/ {* pathInfo}的所有请求。 (取自ServiceStack MVC Host Web.config示例和此答案https://stackoverflow.com/a/12151501/801189

这应该适用于IIS 6和7.您可以通过修改'add'元素中的path =“*”将特定处理程序分配到'route'之后的不同路径

  <location path="route">
    <system.web>
      <httpHandlers>
        <add path="*" type="System.Web.Handlers.TransferRequestHandler" verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" />
      </httpHandlers>
    </system.web>
    <!-- Required for IIS 7.0 -->
    <system.webServer>
      <modules runAllManagedModulesForAllRequests="true" />
      <validation validateIntegratedModeConfiguration="false" />
      <handlers>
        <add name="ApiURIs-ISAPI-Integrated-4.0" path="*" type="System.Web.Handlers.TransferRequestHandler" verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" preCondition="integratedMode,runtimeVersionv4.0" />
      </handlers>
    </system.webServer>
  </location>

6
投票

MVC 5.0解决方法。

许多建议的答案似乎在MVC 5.0中不起作用。

由于最后一节中的404点问题可以通过使用尾部斜杠关闭该部分来解决,这里是我使用的小技巧,干净简单。

在视图中保留方便的占位符:

@Html.ActionLink("Change your Town", "Manage", "GeoData", new { id = User.Identity.Name }, null)

添加一点jquery / javascript来完成工作:

<script>
    $('a:contains("Change your Town")').on("click", function (event) {
        event.preventDefault();
        window.location.href = '@Url.Action("Manage", "GeoData", new { id = User.Identity.Name })' + "/";
    });</script>

请注意尾随斜线,负责更改

http://localhost:51003/GeoData/Manage/[email protected]

http://localhost:51003/GeoData/Manage/[email protected]/

4
投票

对于那些仅在一个网页上拥有此功能的人来说,这是一个非常简编辑您的actionlink并在其末尾添加+“/”。

  @Html.ActionLink("Edit", "Edit", new { id = item.name + "/" }) |

2
投票

您可能想要考虑使用短划线而不是句点。

Pro ASP MVC 3 Framework,他们提出了关于制作友好网址的建议:

避免使用符号,代码和字符序列。如果你想要一个单词分隔符,请使用短划线(/ my-great-article)。下划线是不友好的,URL编码的空间是奇怪的(/我+伟大+文章)或恶心(/我的%20great%20article)。

它还提到URL应该易于阅读和更改为人类。也许考虑使用破折号而不是点的理由也来自同一本书:

不要对HTML页面(.aspx或.mvc)使用文件扩展名,但要将它们用于特殊的文件类型(.jpg,.pdf,.zip等)。如果您正确设置MIME类型,Web浏览器不关心文件扩展名,但人们仍然期望PDF文件以.pdf结尾

因此,尽管人们仍然可以读取一段时间(虽然不如破折号,IMO可读),但它可能仍然有点令人困惑/误导,具体取决于句点后的内容。如果有人有拉链的姓氏怎么办?然后URL将是/John.zip而不是/ John-zip,甚至可能会误导编写应用程序的开发人员。


2
投票

根据保持URI没有查询字符串的重要性,您也可以将带有点的值作为查询字符串的一部分传递,而不是URI。

例如。 www.example.com/people?name=michael.phelps可以使用,无需更改任何设置或任何内容。

您失去了拥有干净URI的优雅,但此解决方案不需要更改或添加任何设置或处理程序。

© www.soinside.com 2019 - 2024. All rights reserved.