316

URLのパスにドットが含まれている必要があるプロジェクトがあります。たとえば、www.example.com / people/michael.phelpsなどのURLがあります。

ドットのあるURLは404を生成します。私のルーティングは問題ありません。ドットなしでmichaelphelpsを渡すと、すべてが機能します。ドットを追加すると、404エラーが発生します。サンプルサイトは、IIS8Expressを搭載したWindows7で実行されています。URLScanが実行されていません。

web.configに以下を追加してみました。

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

残念ながら、それは違いを生みませんでした。404.0NotFoundエラーが表示されます。

これはMVC4プロジェクトですが、関係ないと思います。私のルーティングは正常に機能し、ドットが含まれるまで、期待するパラメーターはそこにあります。

URLにドットを含めるには、何を構成する必要がありますか?

4

18 に答える 18

387

私は自分のサイトのHTTPハンドラーを編集することでこれを機能させました。私のニーズでは、これはうまく機能し、私の問題を解決します。

特定のパス基準を検索する新しいHTTPハンドラーを追加しただけです。リクエストが一致する場合、処理のために.NETに正しく送信されます。このソリューションでは、URLRewriteがハックするかRAMMFARを有効にすることに非常に満足しています。

たとえば、.NETでURL www.example.com/people/michael.phelpssystem.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" />

編集

この問題の解決策がまたはであることを示唆する他の投稿がありRAMMFARますRunAllManagedModulesForAllRequests。このオプションを有効にすると、すべての要求に対してすべての管理対象モジュールが有効になります。つまり、画像、PDF、その他すべての静的ファイルは、必要のないときに.NETによって処理されます。特定のケースがない限り、このオプションは省略しておくのが最適です。

于 2012-08-28T01:01:06.993 に答える
50

少し調べてみると、relaxedUrlToFileSystemMappingがまったく機能しないことがわかりました。私の場合は、RAMMFARをtrueに設定しました。これは、(。net 4.0 + mvc3)と(.net 4.5 + mvc4)にも当てはまります。

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

RAMMFARを設定するときは、RAMMFARとパフォーマンスに関するHanselmanの投稿に注意してください。

于 2012-08-21T23:19:01.197 に答える
29

web.configでプロパティrelaxedUrlToFileSystemMappingを設定する必要があると思います。 Haackは少し前にこれについての記事を書きました(そして同じタイプの質問をする他のいくつかのSO投稿があります)

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

編集 以下のコメントから、.NET / IISの新しいバージョンでは、これをsystem.WebServer要素に含める必要がある場合があります。

<system.webServer>
<httpRuntime relaxedUrlToFileSystemMapping="true" />
于 2012-07-30T21:39:09.997 に答える
26

私はこの問題に長い間立ち往生しましたが、さまざまな救済策が無駄になりました。

ドット[。]を含むURLの末尾にスラッシュ[/]を追加すると、404エラーがスローされず、実際に機能することに気付きました。

私はついにIISURLRewriteのようなURLリライターを使用して問題を解決し、特定のパターンを監視してトレーニングスラッシュを追加しました。

私のURLは次のようになります:/Contact/~firstname.lastnameなので、私のパターンは単純です:/Contact/~(.*[^/])$

このアイデアはScottForsythから得ました。以下のリンクを参照してください: http ://weblogs.asp.net/owscott/handing-mvc-paths-with-dots-in-the-path

于 2015-05-30T15:41:12.203 に答える
21

このセクションをWeb.configに追加するだけで、pathInfoにドットがある場合でも、route /{*pathInfo}へのすべてのリクエストは指定されたハンドラーによって処理されます。(ServiceStack MVCホストWeb.configの例とこの回答https://stackoverflow.com/a/12151501/801189から取得)

これは、IIS6と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>
于 2013-05-17T11:18:49.320 に答える
6

MVC5.0の回避策。

提案された回答の多くは、MVC5.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/
于 2017-02-24T18:54:08.617 に答える
5

これを1つのWebページにしか持っていない人にとっては非常に簡単な答えです。アクションリンクとその末尾の+「/」を編集します。

  @Html.ActionLink("Edit", "Edit", new { id = item.name + "/" }) |
于 2016-11-29T18:00:54.547 に答える
3

クエリ文字列なしでURIを保持することがどれほど重要かによっては、URIではなくクエリ文字列の一部としてドットを使用して値を渡すこともできます。

たとえば、www.example.com / people?name = michael.phelpsは、設定などを変更しなくても機能します。

クリーンなURIを持つという優雅さは失われますが、このソリューションでは、設定やハンドラーを変更または追加する必要はありません。

于 2018-08-01T18:08:55.873 に答える
2

ピリオドの代わりにダッシュを使用することを検討することをお勧めします。

Pro ASP MVC 3 Frameworkでは、わかりやすいURLの作成について次のように提案しています。

記号、コード、文字シーケンスは避けてください。単語の区切り文字が必要な場合は、ダッシュ(/ my-great-article)を使用します。アンダースコアはわかりにくく、URLエンコードされたスペースは奇妙(/ my + great + article)または嫌なもの(/ my%20great%20article)です。

また、URLは、人間にとって読みやすく、変更しやすいものでなければならないことにも言及しています。たぶん、ドットの代わりにダッシュを使用することを考える理由も同じ本から来ています:

HTMLページ(.aspxまたは.mvc)にはファイル名拡張子を使用しないでください。ただし、特殊なファイルタイプ(.jpg、.pdf、.zipなど)には使用してください。MIMEタイプを適切に設定すれば、Webブラウザーはファイル名拡張子を気にしませんが、人間はPDFファイルが.pdfで終わることを期待しています。

したがって、ピリオドは人間にはまだ読めますが(ダッシュ、IMOよりは読めませんが)、ピリオドの後に続くものによっては、少し混乱したり誤解を招いたりする可能性があります。誰かがzipの名前を持っている場合はどうなりますか?その場合、URLは/John-zipではなく/John.zipになります。これは、アプリケーションを作成した開発者にとっても誤解を招く可能性があります。

于 2012-08-29T16:43:33.920 に答える
1

URL構造を変更することは可能でしょうか?
私が取り組んでいたことのために私はのためのルートを試しました

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」やアクションなどの不要な単語を入れて、プロパティを次のような末尾で終了できるようにすることもできます。/mike.smith/view

于 2015-10-16T17:30:56.010 に答える
1

上記のすべての解決策を試しましたが、どれもうまくいきませんでした。うまくいったのは、すべての多言語バージョンを含む、4.5を超える.NETバージョンをアンインストールすることでした。最終的に、新しい(英語のみ)バージョンを1つずつ追加しました。現在、私のシステムにインストールされているバージョンは次のとおりです。

  • 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または英語以外のすべてのバージョンが私の構成を台無しにしていたと推測することしかできませんでした。

于 2016-05-23T09:27:31.350 に答える
1

.解決策として、base64のように、シンボルを含まない形式へのエンコードを検討することもできます。

jsで追加する必要があります

btoa(parameter); 

コントローラー内

byte[] bytes = Convert.FromBase64String(parameter);
string parameter= Encoding.UTF8.GetString(bytes);
于 2017-06-13T08:49:20.083 に答える
1

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

于 2019-02-21T09:35:01.283 に答える
0

https://stackoverflow.com/a/13082446/1454265のソリューションを使用し、パスを置き換えることで、この問題の特定のバージョンを解決できました(/customer.htmlを/ customerにルーティングする必要があり、末尾のスラッシュは許可されていません) 。 ="*。html"。

于 2014-02-12T18:47:57.960 に答える
0

URL書き換えルールをWeb.configアーカイブに追加します。URLリライトモジュールがIISにすでにインストールされている必要があります。次の書き換えルールを自分のインスピレーションとして使用してください。

<?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> 
于 2018-05-10T21:53:27.193 に答える
0

また、(関連する)ハンドラーマッピングの順序を確認してください。その後のパスに.svc(例:/foo.asmx/bar.svc/path)を含む.ashxがありました。.svcマッピングが最初だったので、.asmxの前に一致した.svcパスの場合は404でした。Havnはあまり考えていませんが、パスをエンコードするURLがこれを処理する可能性があります。

于 2018-06-14T09:59:04.297 に答える
0

これは、IIS7.5および.NETFramework 4.5環境で、 runAllManagedModulesForAllRequests = "true"を使用せずに、エラー404に対して私が見つけた最良の解決策です

私はこのスレッドをフォローしました:https ://forums.asp.net/t/2070064.aspx?Web + API + 2 + URL + routing + 404 + error + on + IIS + 7 + 5 + IIS + Express + works + fineそれに応じてweb.configを変更しました。これで、MVCWebアプリはIIS7.5および.NETFramework4.5環境で正常に機能します。

于 2020-12-08T11:42:36.990 に答える
-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");
        }
    }
}
于 2015-12-20T16:12:27.177 に答える