【IIS】URL書き換え(URL Rewrite)を使用したポート番号の変更

# はじめに
社内で調査用にFAQサイトとしてオープンソースの「[phpMyFAQ](https://www.phpmyfaq.de/)」をWindow Server上に構築しました。
WebサーバーはIISではなくApacheを使用したため、ポート番号は1080番となっている。

その際にポート番号なしのURLを入力して、phpMyFAQサイトの接続できるようにしたい。
調査したところ2つの方法がある。

* URLのポート番号を表示
* URLのポート番号を非表示

※今回の記事を書く上では、phpMyFAQではなくテストサイトで試している。

# 導入方法
URL書き換えを行うには、IISに拡張モジュールを追加する必要があリます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/68ef027e-b1cf-34fc-e174-c6fe4e794e27.png)

:::note warn
「Application Request Routing Chace」のアイコンは、「(PC名)ホーム」側に表示されます。「Default Web Site ホーム」側には表示されません。
:::

## URL Rewrite
IISのURL Rewrite(URL書き換え処理)は、Microsoftによって提供されている無償のモジュールです。モジュール名のとおりURLの書き換えのほか、リダイレクトを行います。
下記サイトからURL Rewriteをインストールしてください。

https://www.iis.net/downloads/microsoft/url-rewrite

## Application Request Routing（ARR）
IISのApplication Request Routing（アプリケーション要求ルーティング処理）は、Microsoftによって提供されている無償のモジュールです。モジュール名のとおりリクエストに対するルーティング機能のほか、負荷分散、ディスクキャッシュの機能を利用できます。
下記サイトからARRをインストールしてください。

https://www.iis.net/downloads/microsoft/application-request-routing

:::note info
URLにポート番号が付かない方法の場合のみ使用します。
:::

# URLのポート番号を表示
ポート番号なしのURLを入力した後、ポート番号が表示されたURLにしてApacheのサイトに接続する。
※正確にはポート番号なしのURLは80ポートが省略されている。

```text:変換例
http://localhost/test/index.html
                   ↓
http://localhost:1080/index.html
```

## URL 書き換えの設定
1.IISマネージャーから「URL 書き換え」をクリックします。
2.規則の追加で規則テンプレート内の受信規則から「空の規則」を選択してOKボタンをクリックします。
3.名前を決めます。今回は「test」にしています。
4.正規表現パターンとして「test(.*)」を入力します。
5.アクションの種類として「**リダイレクト**」を選択します。
6.リダイレクト URL先を入力します。今回は「`http://localhost:1080/{R:0}`」とします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/33842468-469a-7077-7d91-3ad778530fca.png)

## 結果
URLのポート番号が表示状態でApacheのサイトに接続されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/c3a6b19b-a718-4bd3-10ed-dc4045568b60.png)

# URLのポート番号を非表示
ポート番号なしのURLを入力した後、そのままのURLでApacheのサイトに接続する。(内部はポート番号が付いたURLに書き換え)

```text
http://localhost/test/index.html
```

## Application Request Routingの設定
1.IISマネージャーから「Application Request Routing」をクリックします。
2.右パネルの操作の「Server　Proxy　Settings」をクリックします。
3.「Enable proxy」にチェックを付けます。
4.右パネルの操作の「適用」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/23d79701-2740-e5f1-4349-90dc70b1c87e.png)

## URL 書き換えの設定
1.IISマネージャーから「URL 書き換え」をクリックします。
2.規則の追加で規則テンプレート内の受信規則から「空の規則」を選択してOKボタンをクリックします。
3.名前を決めます。今回は「test」にしています。
4.正規表現パターンとして「test(.*)」を入力します。
5.アクションの種類として「**書き換え**」を選択します。
6.リダイレクト URL先を入力します。今回は「`http://localhost:1080/{R:0}`」とします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/8d2e7a05-ea8e-6e29-4258-b6cb9783c153.png)

## 結果
URLのポート番号が非表示状態でApacheのサイトに接続されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/ce96a9c4-3b50-7416-19aa-625fe139eedd.png)

# 最後に
社内のみで使用するならURLのポート番号が表示状態でも気にならないだろうが、社外に公開するような場合だとURLのポート番号が非表示状態の方が好ましいだろう。

記事を書く際には既に理解したから書いているわけで、そこに至るまでは理解不足でネット検索しまくりである。
URL書き換えでポートを変更するだけなら簡単だろうと思ったんだが、正規表現は合っているのに全然変わらないのである。日本語での検索サイトで探しても一向に分からない。そこでキーワードを英語にして「IIS URL Rewrite port change」にして、「[URL Rewrite to specific port - MSDN Forum](https://social.msdn.microsoft.com/Forums/en-US/5734c7d8-c828-4e97-bddb-2ee43e2b3f7a/url-rewrite-to-specific-port?forum=iisurlrewritemodule)」を見つける。まさに実現したい内容だった。

日本語訳で「1 つの Web サーバーから (同じ物理サーバー上の) 別の Web サーバーにハンドオフしているため、書き換えではなくリダイレ​​クトを行う必要があります。」と、やっと何を間違えているのかを理解しました。
アクションの種類を「**書き換え**」から「**リダイレクト**」にすることでようやく目的を達成することができました。

そこから日本語サイトでのURL書き換えを説明しているサイトの内容を見直し、Application Request Routingを使用した場合にアクションの種類を「**書き換え**」にする必要があるってことがわかったのです。

# 参照
* [URL Rewrite to specific port - MSDN Forum](https://social.msdn.microsoft.com/Forums/en-US/5734c7d8-c828-4e97-bddb-2ee43e2b3f7a/url-rewrite-to-specific-port?forum=iisurlrewritemodule)
* [URL 書き換えモジュールでの書き換えマップの使用](https://learn.microsoft.com/ja-jp/iis/extensions/url-rewrite-module/using-rewrite-maps-in-url-rewrite-module?source=recommendations)
* [Windows IIS／Azure WebサイトのURL Rewrite機能でURLを書き換える（基本編）](https://atmarkit.itmedia.co.jp/ait/articles/1407/23/news103.html)
* [IIS Public WAN Redirect to Different Port](https://community.spiceworks.com/topic/2114640-iis-public-wan-redirect-to-different-port)
* [URL rewrite with port redirect - MSDN Forum](https://social.msdn.microsoft.com/Forums/en-US/16e26f8d-1e5b-4999-b21e-5953d6c2faf4/url-rewrite-with-port-redirect?forum=iisurlrewritemodule)
* [IIS 10とTomcat 8.5をApplication Request Routingで連携](https://symfoware.blog.fc2.com/blog-entry-2076.html)
* [Application Request Routing(ARR)を使ったRedmineの設定について](https://blog.shibata.tech/entry/2017/11/05/214253)
* [C#コードによるARR 3.0 RTMのインストールと設定](https://www.buildinsider.net/web/iis8/02)