web-dev-qa-db-ja.com

URLにドットがあるとASP.NET mvcおよびIISで404

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

ドット付きのURLは404を生成します。私のルーティングは問題ありません。ドットなしでmichaelphelpsを渡すと、すべてがうまくいきます。ドットを追加すると404エラーになります。サンプルサイトは、IIS 7 Expressを搭載したWindows 7上で稼働しています。 URLScanが実行されていません。

私は私のweb.configに以下を追加してみました:

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

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

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

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

289
Mark

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

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

たとえば、.NETにURLを処理させるにはwww.example.com/people/michael.phelpsサイトのweb.configのsystem.webServer / handlers要素内に次の行を追加します。

<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によって処理されます。特別な場合がない限り、このオプションは指定しないことをお勧めします。

364
Mark

私の場合、RAMMFARをtrueに設定することで、relaxedUrlToFileSystemMappingがまったく機能しないことがわかったので、(.net 4.0 + mvc3)と(.net 4.5 + mvc4)についても同じことが言えます。

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

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

46
Tadeu Maia

私はあなたがあなたのweb.configでプロパティrelaxedUrlToFileSystemMappingを設定しなければならないと思います。 Haack が少し前にこの記事を書いています(そして他にも SO記事があります 同じ種類の質問をする)

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

私は無駄なことなくすべての異なる救済策を実行した後、長い間この問題に立ち往生しました。

ドット[。]を含むURLの最後にスラッシュ[/]を追加すると、404エラーが発生せず、実際に機能することに気付きました。

私はようやくIIS URL RewriteのようなURLリライタを使って問題を解決し、特定のパターンに注目してトレーニングスラッシュを追加しました。

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

私はスコットフォーサイスからこの考えを得ました、下記のリンクを見てください: http://weblogs.asp.net/owscott/handing-mvc-paths-with-dots-in-the-path

23
Leon van Wyk

このセクションをWeb.configに追加するだけで、path /にドットがある場合でも、route/{* pathInfo}へのすべての要求は指定されたハンドラによって処理されます。 (ServiceStack MVCホスト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
V.B.

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]/
6
Luke

1つのWebページにしかない人のための超簡単な答え。アクションリンクを編集し、最後に+ "/"を付けます。

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

URIをクエリ文字列なしで保持することの重要性に応じて、URIではなくクエリ文字列の一部としてドットを使用して値を渡すこともできます。

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

あなたはきれいなURIを持っているという優雅さを失います、しかしこの解決策は設定やハンドラを変更または追加する必要はありません。

2
GR7

あなたはピリオドの代わりにダッシュを使うことを考えたいかもしれません。

Pro ASP MVC 3 Framework 彼らはフレンドリーなURLを作ることについてこれを提案します:

記号、コード、および文字シーケンスを避けます。 Wordの区切り文字が必要な場合は、ダッシュ(/ 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になり、アプリケーションを作成した開発者にとっても誤解を招く可能性があります。

2
sdm350

上記のすべての解決策を試しましたが、それらのどれも私のために働きませんでした。うまくいったのは、私が.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
jokab

あなたの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フォーマットへのリンクも作ります。

たぶんあなたはあなたの財産が/のような末尾の/mike.smith/viewで終わることができるようにあなたのルートの終わりに "/ view"やアクションのような不要なWordを置くことができます

1
jonduncan05

Path = "を変更するのと同じくらい簡単です。 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

1
Jonny

URL書き換えルールをWeb.configアーカイブに追加します。 IISに RL Rewriteモジュール が既にインストールされている必要があります。あなた自身のためのインスピレーションとして次の書き換え規則を使ってください。

<?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を含む.ashx(例:/foo.asmx/bar.svc/path)がありました。 .svcマッピングは、.asmxの前に一致した.svcパスの最初の404です。あまり考えたことはありませんが、パスをエンコードするURLがこれを処理します。

0
stuartm9999
0
user1454265

解決策として、base64としてsymbol.を含まないフォーマットへのエンコードを検討することもできます。

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

btoa(parameter); 

コントローラー内

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