none
URL書き換え(2重スラッシュ) RRS feed

  • 質問

  • お世話になっております。

    IIS8.5にARR (Application Request Routing)をインストールして、

    「URL書き換え」の設定について。

    URLが、http://test.co.jp/aaaa/1//0

    と、スラッシュが2重になった時に、

    aaaa/(.*)/(.*)/(.*)

    というマッチルールを設定すると

    パラメータが一つずれてマッチしなくなってしまいます。

    IISのログを見ても

    http://test.co.jp/1/0

    となってしまっているようです。

    スラッシュが2重になった時に省略されないようにすることはできますでしょうか?

    マッチールールの記述側で考慮すべきでしょうか?


    2014年12月17日 2:12

回答

  • URL Rewriteでの書き換えに関しては、IISが処理する前のURLをUNENCODED_URLで参照でき、これにもパターンを適用することができます。

    ご質問の例に当てはめると、例えば、次のようになります。

    パターン: ^aaaa/
    条件
     入力: {UNENCODED_URL}
     パターン: ^/aaaa/(.*)/(.*)/(.*)
    アクション
     URLの書き換え: xxxx.asp?x={C:1}&y={C:2}&z={C:3}


    連続するスラッシュを1つに縮めてしまうというIISのそもそもの動作を抑制する方法がないかも一応調べてみましたが、こちらは全く手掛かり無しでした。

    ご参考になれば幸いです。

    • 回答としてマーク kz20140602 2014年12月19日 4:42
    2014年12月18日 14:20

すべての返信

  • > IIS8.5にARR (Application Request Routing)をインストールして、

    ARR をインストールすると、依存関係にある「URL書き換え(URL Rewrite Module)」も追加されるという話ですが、今回の質問は(前回のホスト名書き換えの話とは違って)URL Rewrite Module の設定方法に限った話と理解していいのでしょうか?

    URL 書き換えモジュールの使用
    http://technet.microsoft.com/ja-jp/library/dd939109.aspx

    2014年12月17日 2:59
  • ご返信ありがとうございます。

    URL Rewrite Module の設定方法に限った話でよいです。

    IISのログからも抜けているように見えたので

    URL Rewrite Moduleで対応ができるかは疑問ですが。

    2014年12月17日 4:28
  • > IISのログからも抜けているように見えたので

    どういう意味か分かりませんが、とにかく URL Rewrite Moule は動いていて URL の書き換えは、期待通りではないとしても、行われるのですよね?

    IIS で動かしている test.co.jp/aaaa の Web アプリは何なのでしょうか? ASP.NET Web Forms ですか?

    また、http://test.co.jp/aaaa/1//0 どのように書き換えたいのか教えてください。


    • 編集済み SurferOnWww 2014年12月17日 9:32 誤字訂正
    2014年12月17日 8:42
  • >> IISのログからも抜けているように見えたので

    >どういう意味か分かりませんが、とにかく URL Rewrite Moule は動いていて URL の書き換えは、期待通りではないとしても、行われるのですよね?

    IISのログにリクエストされたURLが表示されるかと思います。

    ブラウザでは、http://test.co.jp/aaaa/1//0

    で、リクエストを行ったのですが

    IISのログのリクエストURLは、http://test.co.jp/aaaa/1/0

    となってしまっているということです。

    >IIS で動かしている test.co.jp/aaaa の Web アプリは何なのでしょうか? ASP.NET Web Forms ですか?

    クラシックASPです。IISで動かしているアプリは、関係ありますでしょうか?

    >また、http://test.co.jp/aaaa/1//0 どのように書き換えたいのか教えてください。

    http://test.co.jp/xxxx.asp?x=1&y=&z=0

    としたいです。

    ちなみに、yの値がブランクにならない場合もあります。


    2014年12月17日 11:14
  • .* を [^/]* にしたらどうなりますか?

    。。。あっ、これじゃだめだ

    • 編集済み かるあ 2014年12月18日 0:11
    2014年12月18日 0:10
  • かるあ様、返信ありがとうございます。

    だめとのコメントがされていましたので、未検証ですが。

    2014年12月18日 1:20
  • 自分の開発マシン(Vista の IIS7)で下記の書き換えルールと 0091-UrlRewrite.aspx という試験用のページを作って検証してみました。

    <rewrite>
      <rules>
        <rule name="DoubleSlash1">
          <match url="aaaa/(.*)/(.*)/(.*)" />
          <action type="Rewrite" url="0091-UrlRewrite.aspx?x={R:1}&amp;y={R:2}&amp;z={R:3}" />
        </rule>
      </rules>
    </rewrite>
    

    IIS マネージャーの「テストパターン」ダイアログ上で、[テスト対象データの入力(D):]テキストボックスに aaaa/1/2/3 とか aaaa/1//3 などのテストパターンを入力してテストしましたが、 {R:1}, {R:2}, {R:3} には期待通りの結果が得られます。

    なので、aaaa/1//3 のまま URL Rewrite モジュールに渡されれば aaaa/(.*)/(.*)/(.*) にマッチして期待通りの書き換えが行われるはずです。

    しかし、ブラウザから aaaa/1//3 で呼ぶとダメです(aaaa/1/2/3 ならば OK)。ダメな理由は、IIS が aaaa/1//3 を aaaa/1/3 に書き換えてしまうからです。

    詳しく書くと以下の通りです。

    (1) ブラウザからは aaaa/1//3 で要求が出る。

    (2) それを受けた IIS は  aaaa/1//3 を aaaa/1/3 に書き換えてしまう。

    (3) aaaa/1/3 が URL Rewrite モジュールに渡される。

    (4) aaaa/1/3 は aaaa/(.*)/(.*)/(.*) にはマッチしない。マッチしないので書き換えは行われない。

    (5) 書き換えが行われないので、IIS は aaaa/1/3 で指定されるリソースを探す。

    (6) そのようなリソースは存在しないので HTTP エラー 404.0 - Not Found となる。

    ちなみに、aaaa/1/2/3 であれば期待通り 0091-UrlRewrite.aspx?x=1&y=2&z=3 に書き換えられ、0091-UrlRewrite.aspx ページ内でクエリ文字列も正しく取得できます。

    上記 (2) がどうして分かったかと言うと、(6) で表示されるエラー画面で「要求された URL http://aspnet4site:80/aaaa/1/3」となっていたからです。(aspnet4site は自分の開発マシンで使っているホスト名です)

    というわけで、上記 (2) を何とかしないと URL Rewrite モジュールでは対処できないのですが、今のところ何とかする方法は見つけられてません。

    2014年12月18日 9:01
  • 検証までしていただいてありがとうございます。

    難しそうですね。

    2014年12月18日 10:00
  • > 難しそうですね。

    空になるのは真中以外にはない(aaaa/1/2/3 と aaaa/1//3 の 2 パターンしかない)と言うことであれば、もうひとつ書き換えルールを作って対応可能だと思いますが、aaaa//2/3 とか aaaa/// のようなパターンもあるのですよね?

    そうだとすると URL Rewrite モジュールでの対応は無理っぽいです。

    2014年12月18日 10:23
  • URL Rewriteでの書き換えに関しては、IISが処理する前のURLをUNENCODED_URLで参照でき、これにもパターンを適用することができます。

    ご質問の例に当てはめると、例えば、次のようになります。

    パターン: ^aaaa/
    条件
     入力: {UNENCODED_URL}
     パターン: ^/aaaa/(.*)/(.*)/(.*)
    アクション
     URLの書き換え: xxxx.asp?x={C:1}&y={C:2}&z={C:3}


    連続するスラッシュを1つに縮めてしまうというIISのそもそもの動作を抑制する方法がないかも一応調べてみましたが、こちらは全く手掛かり無しでした。

    ご参考になれば幸いです。

    • 回答としてマーク kz20140602 2014年12月19日 4:42
    2014年12月18日 14:20
  • > IISが処理する前のURLをUNENCODED_URLで参照でき、

    UNENCODED_URL に気がつきませんでした。それでブラウザが要求したとおりの URL が取得できますね。

    先に検証した構成のまま、web.config のルールを以下のように書き換えて、aaaa/1/2/3 でも、aaaa/1//3 でも、aaaa//2/3 でも、 aaaa/// でも、その他全てのパターンで期待通り書き換えられるのを確認できました。

    <rule name="DoubleSlash1">
      <match url="^aaaa/" />
      <action type="Rewrite" url="0091-UrlRewrite.aspx?x={C:1}&amp;y={C:2}&amp;z={C:3}" />
      <conditions>
        <add input="{UNENCODED_URL}" pattern="^/aaaa/(.*)/(.*)/(.*)" />
      </conditions>
    </rule>
    

    フォローありがとうございました。
    2014年12月18日 16:16
  • Alfred360さん

    回答ありがとうございます。

    {UNENCODED_URL}で処理前のURLを取れ

    こちらに対してもルールが適用できるとのことで

    ありがとうございます。

    2014年12月19日 4:42