9

.NET MVCサイトでは、次のように複数の前方スラッシュでURLをヒットできることに気づきました。

http://www.example.com//category
http://www.example.com//category//product

URLは正常に読み込まれ、すべてが機能しますが、これを防ぐように求められました。

私はIISURLリライトを使用してそれを機能させようとしています:

<rewrite>
    <rules>
        <rule name="Remove multiple slashes" stopProcessing="true">
            <match url="(.*)" />
            <conditions>
                <add input="{UNENCODED_URL}" matchType="Pattern" pattern="^(.*)//(.*)$" />
            </conditions>
            <action type="Redirect" redirectType="Permanent" url="{C:1}/{C:2}" />
         </rule>
    </rules>
</rewrite>

ただし、結果は非常に気質のようです。商品のURLがリダイレクトされる場合とリダイレクトされない場合があり、同じことがカテゴリでも発生します。これは、URLがアプリケーションによってキャッシュされているようなものです。

配置されているキャッシュを無効にできるかどうか、またはこの複数のスラッシュの問題を回避する別の方法があるかどうかを誰かが知っていますか?

どんな助けでも大歓迎です。

4

3 に答える 3

6

結局、私はそれを機能させるためにリダイレクトの背後にあるコードを使用することに頼りました。

IIS URLリライトを使用していた問題は、IISがリダイレクトをキャッシュする方法が原因でした。WouterHが提案したように、キャッシュを完全に無効にすると、機能しました。ただし、パフォーマンスの問題が発生する可能性があるため、この方法でキャッシュを無効にするのは快適ではありません。

私の修正は、Global.asax.csファイルでリダイレクトの背後にあるコードを使用することでした。

protected void Application_BeginRequest(object sender, EventArgs e)
{
    string requestUrl = Request.ServerVariables["REQUEST_URI"];
    string rewriteUrl = Request.ServerVariables["UNENCODED_URL"];
    if (rewriteUrl.Contains("//") && !requestUrl.Contains("//"))
        Response.RedirectPermanent(requestUrl);
}

これを機能させるためにIISURLRewriteを使用したかったのですが、残念ながら、その行を続行する時間がありませんでした。

興味深いことに、以下の方法は機能しHTTP_X_REWRITE_URLましたが、ローカルで実行しているHelicon ISAPI Rewriteによって追加されましたが、本番サーバーでは使用できません。

<rewrite>
  <rules>
    <rule name="Remove multiple slashes" stopProcessing="true">
      <match url=".*" />
      <action type="Redirect" url="{REQUEST_URI}" />
      <conditions>
        <add input="{HTTP_X_REWRITE_URL}" pattern="([^/]*)/{2,}([^/]*)" />
      </conditions>
    </rule>
  </rules>
</rewrite>
于 2012-08-22T13:59:00.907 に答える
3

URL書き換えモジュール

IISは2つのスラッシュでURLを自動的に正規化するため、次のように正規化されたURLにリダイレクトしてみることができます。

<rewrite>
  <rules>
    <rule name="Remove multiple slashes" stopProcessing="true">
      <match url=".*" />
      <action type="Redirect" url="{REQUEST_URI}" />
      <conditions>
        <add input="{UNENCODED_URL}" pattern="(.*?)[/]{2,}$" />
      </conditions>
    </rule>
  </rules>
</rewrite>

URL書き換えモジュールのキャッシュを無効にすることもできます。

書き換えルールの内部キャッシュを無効にする

URLリライトモジュールでインバウンドリライトルールのキャッシュを無効にするには、管理者特権のコマンドプロンプトから次のコマンドを実行します。

reg add HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\InetStp\Rewrite /v RewriteCacheEnabled /t REG_DWORD /d 0

この変更後、Webサーバーを再起動する必要があると少し感じています:)

その他のオプション#1:キャッシュできないサーバー変数

このアイデアが頭に浮かびました。

ルールでキャッシュ不可能なサーバー変数を使用します。HTTP_USER_AGENT

<rewrite>
  <rules>
    <rule name="Remove multiple slashes" stopProcessing="true">
      <match url=".*" />
      <action type="Redirect" url="{REQUEST_URI}" />
      <conditions>
        <add input="{UNENCODED_URL}" pattern="(.*?)[/]{2,}$" />
        <add input="{HTTP_USER_AGENT}" pattern=".*" />
      </conditions>
    </rule>
  </rules>
</rewrite>

ここで他のサーバー変数を調べることができます

その他のオプション#2:ブラウザのキャッシュをクリアする

Web開発中は、Ctrl + F5を使用してページを更新するか、書き換えルールの更新などの変更を行った後にブラウザのキャッシュをクリアしてください。そうしないと、ブラウザだけで同じ問題を監視するのに何時間も費やす可能性があります。キャッシュを更新します。

その他のオプション#3:IIRF

本当にIISURL書き換えモジュールで動作させることができない場合は、オープンソースのISAPIモジュールIIRFを試してみることができます。mod_rewriteApacheの場合と同様のルールを受け入れます。

于 2012-08-17T11:29:15.057 に答える
0

フォローしてみてください

    <rule name="RemoveMultipleSlashes" patternSyntax="ECMAScript" stopProcessing="true">
        <match url=".*" />
        <action type="Redirect" url="{REQUEST_URI}" />
        <conditions>
            <add input="{UNENCODED_URL}" pattern="([^/]*)/{2,}([^/]*)" />
        </conditions>
    </rule>
于 2012-08-17T11:43:49.810 に答える