it-swarm.com.de

Punkte in URL verursachen 404 mit ASP.NET-MVC und IIS

Ich habe ein Projekt, für das meine URLs Punkte im Pfad enthalten müssen. Zum Beispiel kann ich eine URL wie www.example.com/people/michael.phelps haben

URLs mit dem Punkt erzeugen eine 404. Mein Routing ist in Ordnung. Wenn ich in michaelphelps vorbeigehe, ohne den Punkt, dann funktioniert alles. Wenn ich den Punkt hinzufüge, erhalte ich einen 404-Fehler. Die Beispielsite wird unter Windows 7 mit IIS8 Express ausgeführt. URLScan läuft nicht.

Ich habe versucht, meiner web.config Folgendes hinzuzufügen:

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

Das hat leider keinen Unterschied gemacht. Ich erhalte gerade den Fehler 404.0 Not Found.

Dies ist ein MVC4-Projekt, aber ich halte das nicht für relevant. Mein Routing funktioniert einwandfrei und die erwarteten Parameter sind vorhanden, bis sie einen Punkt enthalten.

Was muss ich konfigurieren, damit ich Punkte in meiner URL haben kann?

291
Mark

Ich habe dies erreicht, indem ich die HTTP-Handler meiner Site bearbeitet habe. Für meine Bedürfnisse funktioniert dies gut und löst mein Problem.

Ich habe einfach einen neuen HTTP-Handler hinzugefügt, der nach bestimmten Pfadkriterien sucht. Wenn die Anforderung übereinstimmt, wird sie zur Verarbeitung korrekt an .NET gesendet. Ich bin viel glücklicher mit dieser Lösung, die URLRewrite hackt oder RAMMFAR aktiviert.

Damit .NET beispielsweise die URL verarbeitet www.example.com/people/michael.phelps füge die folgende Zeile zur web.config deiner Site in der 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" />

Bearbeiten

Es gibt andere Posts, die vorschlagen, dass die Lösung für dieses Problem RAMMFAR oder RunAllManagedModulesForAllRequests ist. Durch Aktivieren dieser Option werden alle verwalteten Module für alle Anforderungen aktiviert. Das bedeutet, dass statische Dateien wie Bilder, PDFs und alles andere von .NET verarbeitet werden, wenn dies nicht erforderlich ist. Diese Option lässt sich am besten deaktivieren, es sei denn, Sie haben einen speziellen Fall dafür.

365
Mark

Nach einigem Stöbern stellte ich fest, dass relaxedUrlToFileSystemMapping für mich überhaupt nicht funktionierte. In meinem Fall wurde RAMMFAR auf true gesetzt. Dies gilt auch für (.net 4.0 + mvc3) und (.net 4.5 + mvc4).

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

Seien Sie sich bewusst, wenn Sie RAMMFAR auf true setzen Hanselman-Post über RAMMFAR und Leistung

46
Tadeu Maia

Ich glaube, Sie müssen die Eigenschaft relaxedUrlToFileSystemMapping in Ihrer web.config einstellen. Haack hat vor einiger Zeit einen Artikel darüber geschrieben (und es gibt einige andere SO posts die gleichen Arten von Fragen stellen)

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

Ich blieb lange bei diesem Thema stecken, nachdem ich all die verschiedenen Mittel erfolglos verfolgt hatte.

Ich habe festgestellt, dass beim Hinzufügen eines Schrägstrichs [/] am Ende der URL, die die Punkte [.] Enthält, kein 404-Fehler aufgetreten ist und dass dies tatsächlich funktioniert hat.

Endlich habe ich das Problem mit einem URL-Rewriter wie IIS URL Rewrite gelöst, um nach einem bestimmten Muster zu suchen und den Trainings-Schrägstrich anzufügen.

Meine URL sieht so aus: /Contact/~Firstname.lastname, also lautet mein Muster einfach: /Contact/~(.*[^/)$

Ich habe diese Idee von Scott Forsyth, siehe Link unten: http://weblogs.asp.net/owscott/handing-mvc-paths-with-dots-in-the-path

23
Leon van Wyk

Fügen Sie diesen Abschnitt einfach zu Web.config hinzu, und alle Anforderungen an route/{* pathInfo} werden vom angegebenen Handler verarbeitet, auch wenn pathInfo Punkte enthält. (entnommen aus dem Beispiel "ServiceStack MVC Host Web.config" und dieser Antwort https://stackoverflow.com/a/12151501/801189 )

Dies sollte für beide IIS 6 & 7 funktionieren. Sie können bestimmten Handlern nach der 'route' verschiedene Pfade zuweisen, indem Sie in 'add' -Elementen path = "*" ändern

  <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
V.B.

Problemumgehung für MVC 5.0.

Viele der vorgeschlagenen Antworten scheinen in MVC 5.0 nicht zu funktionieren.

Da das 404-Punkt-Problem im letzten Abschnitt gelöst werden kann, indem dieser Abschnitt mit einem abschließenden Schrägstrich geschlossen wird, ist hier der kleine Trick, den ich benutze, sauber und einfach.

Behalten Sie einen praktischen Platzhalter im Blick:

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

füge ein wenig jquery/javascript hinzu, um die Arbeit zu erledigen:

<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>

bitte beachten Sie den abschließenden Schrägstrich, der für die Änderung verantwortlich ist

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

in

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

Super einfache Antwort für diejenigen, die dies nur auf einer Webseite haben. Bearbeiten Sie Ihren Actionlink und ein + "/" am Ende.

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

Abhängig davon, wie wichtig es ist, dass Sie Ihren URI ohne Abfragezeichenfolgen beibehalten, können Sie den Wert auch nur mit Punkten als Teil der Abfragezeichenfolge übergeben, nicht mit der URI.

Z.B. www.example.com/people?name=michael.phelps wird funktionieren, ohne dass irgendwelche Einstellungen oder irgendetwas geändert werden müssen.

Sie verlieren die Eleganz eines sauberen URI, aber für diese Lösung müssen keine Einstellungen oder Handler geändert oder hinzugefügt werden.

2
GR7

Möglicherweise möchten Sie Bindestriche anstelle von Punkten verwenden.

In Pro ASP MVC 3 Framework schlagen sie Folgendes vor, um benutzerfreundliche URLs zu erstellen:

Vermeiden Sie Symbole, Codes und Zeichenfolgen. Wenn Sie ein Word-Trennzeichen verwenden möchten, verwenden Sie einen Bindestrich (/ my-great-article). Unterstriche sind unfreundlich, und URL-codierte Leerzeichen sind bizarr (/ mein + großer + Artikel) oder widerlich (/ mein% 20großer% 20Teilchen).

Es wird auch erwähnt, dass URLs für Menschen leicht zu lesen und zu ändern sein sollten. Vielleicht stammt ein Grund, über die Verwendung eines Strichs anstelle eines Punkts nachzudenken, auch aus demselben Buch:

Verwenden Sie keine Dateinamenerweiterungen für HTML-Seiten (ASPX oder MVC), sondern für spezielle Dateitypen (JPG, PDF, ZIP usw.). Webbrowser interessieren sich nicht für Dateinamenerweiterungen, wenn Sie den MIME-Typ entsprechend festlegen. Menschen erwarten jedoch weiterhin, dass PDF Dateien mit .pdf enden

Während ein Punkt für Menschen noch lesbar ist (obwohl er weniger lesbar ist als Striche, IMO), kann er dennoch etwas verwirrend/irreführend sein, je nachdem, was nach dem Punkt kommt. Was ist, wenn jemand den Nachnamen zip hat? Dann lautet die URL /John.Zip anstelle von/John-Zip, was selbst für den Entwickler, der die Anwendung geschrieben hat, irreführend sein kann.

2
sdm350

Ich habe alle oben genannten Lösungen ausprobiert, aber keine hat für mich funktioniert. Was funktionierte, war die Deinstallation von .NET-Versionen> 4.5, einschließlich aller mehrsprachigen Versionen; Irgendwann habe ich Stück für Stück neuere (nur englische) Versionen hinzugefügt. Derzeit sind auf meinem System folgende Versionen installiert:

  • 2,0
  • 3.0
  • 3,5 4
  • 4.5
  • 4.5.1
  • 4.5.2
  • 4.6
  • 4.6.1

Und es funktioniert immer noch an diesem Punkt. Ich habe Angst, 4.6.2 zu installieren, weil es alles durcheinander bringen könnte.

Daher konnte ich nur spekulieren, dass entweder 4.6.2 oder all diese nicht englischen Versionen meine Konfiguration durcheinander brachten.

HTH jemand.

1
jokab

Wäre es möglich, Ihre URL-Struktur zu ändern?
Für das, woran ich arbeitete, habe ich eine Route ausprobiert

url: "Download/{fileName}"

aber es scheiterte mit allem, was eine hatte. drin.

Ich habe die Route zu gewechselt

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

Jetzt kann ich localhost:xxxxx/File1.doc/Download Eingeben und es funktioniert einwandfrei.

Meine Helfer in der Ansicht haben es auch aufgegriffen

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

das macht auch einen Link zum Format localhost:xxxxx/File1.doc/Download.

Möglicherweise können Sie ein nicht benötigtes Wort wie "/ view" oder eine nicht benötigte Aktion am Ende Ihrer Route einfügen, damit Ihre Eigenschaft mit einem nachgestellten / Wie /mike.smith/view Endet.

1
jonduncan05

Es ist so einfach wie das Ändern des Pfades = "." zum Pfad = "". Entfernen Sie einfach den Punkt im Pfad für ExensionlessUrlHandler-Integrated-4.0 in der Datei web.config.

Hier ist ein netter Artikel https://weblog.west-wind.com/posts/2015/Nov/13/Serving-URLs-with-File-Extensions-in-an-ASPNET-MVC-Application

1
Jonny

Fügen Sie die URL Rewrite-Regel zum Web.config-Archiv hinzu. Sie müssen das RL Rewrite-Modul bereits in IIS installiert haben. Verwenden Sie die folgende Regel zum Umschreiben als Inspiration für Ihre eigenen.

<?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

Überprüfen Sie auch (im Zusammenhang) die Reihenfolge Ihrer Handler-Zuordnungen. Wir hatten eine .ashx-Datei mit einer .svc-Datei (z. B. /foo.asmx/bar.svc/path) im Pfad danach. Die .svc-Zuordnung war zunächst 404 für den .svc-Pfad, der vor der .asmx übereinstimmte. Ich habe nicht zu viel darüber nachgedacht, aber vielleicht würde die URL, die den Pfad codiert, das erledigen.

0
stuartm9999

Ich konnte meine spezielle Version dieses Problems (musste /customer.html Route zu/customer erstellen, abschließende Schrägstriche nicht zulässig) mithilfe der Lösung unter https://stackoverflow.com/a/13082446/1454265) lösen und Pfad = "*. html" ersetzen.

0
user1454265

Als Lösung könnte auch erwogen werden, in ein Format zu codieren, das kein Symbol . Enthält, wie beispielsweise base64.

In js sollte hinzugefügt werden

btoa(parameter); 

In der Steuerung

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