首页 文章

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

提问于
浏览
273

我有一个项目,要求我的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项目,但我不认为这是相关的 . 我的路由工作正常,我期望的参数在那里,直到它们包含一个点 .

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

16 回答

  • 3

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

    在js中应该添加

    btoa(parameter);
    

    在控制器中

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

    只需将此部分添加到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>
    
  • 21
    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");
            }
        }
    }
    
  • 0

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

  • 0

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

    我注意到,当在包含点[ . ]的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

  • 0

    我通过编辑我的网站的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" />
    

    Edit

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

  • 4

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

  • 18

    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/user@foo.com
    

    http://localhost:51003/GeoData/Manage/user@foo.com/
    
  • 1

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

    Pro ASP MVC 3 Framework中,他们建议使用友好的URL:

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

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

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

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

  • -3

    可不可能是可以改变你的网址结构?
    对于我正在研究的内容,我尝试了一条路线

    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"或动作,这样你的 property 就可以以 /mike.smith/view 这样的尾随结尾 /mike.smith/view

  • 1

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

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

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

  • 0

    尝试了上面的所有解决方案,但没有一个适合我 . 我卸载.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有人 .

  • 5

    将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>
    
  • 351

    对于那些只在一个网页上有这个的人来说,这是一个非常简单编辑您的actionlink并在其末尾添加“/” .

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

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

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

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

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

    设置RAMMFAR时要注意_275062_

相关问题