Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Dots in URL causes 404 with ASP.NET mvc and IIS

I have a project that requires my URLs have dots in the path. For example I may have a URL such as www.example.com/people/michael.phelps

URLs with the dot generate a 404. My routing is fine. If I pass in michaelphelps, without the dot, then everything works. If I add the dot I get a 404 error. The sample site is running on Windows 7 with IIS8 Express. URLScan is not running.

I tried adding the following to my web.config:

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

Unfortunately that didn't make a difference. I just receive a 404.0 Not Found error.

This is a MVC4 project but I don't think that's relevant. My routing works fine and the parameters I expect are there, until they include a dot.

What do I need to configure so I can have dots in my URL?

like image 246
Mark Avatar asked Jul 30 '12 20:07

Mark


People also ask

What is URL pattern in MVC?

URL patterns for routes in MVC Applications typically include {controller} and {action} placeholders. When a request is received, it is routed to the UrlRoutingModule object and then to the MvcHandler HTTP handler.

What is the main purpose of URL routing in an ASP NET MVC application?

The ASP.NET MVC framework includes a flexible URL routing system that enables you to define URL mapping rules within your applications. The routing system has two main purposes: Map incoming URLs to the application and route them so that the right Controller and Action method executes to process them.

What is default URL in MVC?

As you can see in the above figure, the route is configured using the MapRoute() extension method of RouteCollection , where name is "Default", url pattern is "{controller}/{action}/{id}" and defaults parameter for controller, action method and id parameter.

How can change URL name in ASP NET MVC?

routes. MapRoute( name: "MyRoute", url: "{Product}/{name}-{id}", defaults: new { controller = "Home", action = "Product", name = UrlParameter. Optional , id = UrlParameter. Optional } );


2 Answers

I got this working by editing my site's HTTP handlers. For my needs this works well and resolves my issue.

I simply added a new HTTP handler that looks for specific path criteria. If the request matches it is correctly sent to .NET for processing. I'm much happier with this solution that the URLRewrite hack or enabling RAMMFAR.

For example to have .NET process the URL www.example.com/people/michael.phelps add the following line to your site's web.config within the system.webServer / handlers element:

<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

There are other posts suggesting that the solution to this issue is RAMMFAR or RunAllManagedModulesForAllRequests. Enabling this option will enable all managed modules for all requests. That means static files such as images, PDFs and everything else will be processed by .NET when they don't need to be. This options is best left off unless you have a specific case for it.

like image 141
Mark Avatar answered Oct 01 '22 14:10

Mark


After some poking around I found that relaxedUrlToFileSystemMapping did not work at all for me, what worked in my case was setting RAMMFAR to true, the same is valid for (.net 4.0 + mvc3) and (.net 4.5 + mvc4).

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

Be aware when setting RAMMFAR true Hanselman post about RAMMFAR and performance

like image 44
Tadeu Maia Avatar answered Oct 01 '22 12:10

Tadeu Maia