先日、ワテが運営しているサイト
www.wareko.net
にLet’s Encryptをインストールして、無事にSSL化する事が出来た。
その結果、このサイトは、
http://www.wareko.net https://www.wareko.net
のどちらでもアクセスが出来る。
さて、この記事では、http に来たリクエストを全て https にリダイレクトするする方法を備忘録としてまとめておく事にした。
では本題に入ろう。
ASP.NET MVCやIISでリダイレクト設定を行う方法
ワテの場合、レンタルサーバーとしてWindows VPSを借りている。
各社のWindows VPSを試してワテが最終的に選んだのはエイブルネット社だ。
Linux VPSだけでなくWindows VPSプランの種類も多いのがエイブルネット社の特徴だ。
世間では少数派のWindows VPSであるが、エイブルネット社はWindows VPSのプランが他社と比べて充実していると思う。
さらに、エイブルネット社は最新Windows Server OSへの対応も早かった。2024年現在、他社では、未だにWindows Server 2008しか使えないなんて言うWindows VPSもある。Windows VPSを選択する場合は、そう言う点も良くチェックすべきだ。
さて、そのエイブルネットのWindows VPS環境で、ワテはWindows Server 2012R2を入れてIISを動かしている。
一方、開発に使うパソコンはWindows 10 pro(64)に、Visual Studio 2017 Communityをインストールして、ASP.NET FormやASP.NET MVC プロジェクトを作成している。
それらのWEBプロジェクトは、Visual StudioのDeployの機能を使ってIISサーバーに発行している。
さて、IISやASP.NETを使ってこんなふうにWEBサイトを作成していると、サイトをリダイレクトしたり、リライトしたい場合が良くある。
今回は
http://www.wareko.net/exampleMVC/
に来たリクエストを
https://www.wareko.net/exampleMVC/
にリダイレクトしたい。
これらの設定を行うには、各種の方法があるのだが、ワテの場合、完全には理解出来ていない。
web.configやRouteConfigの設定で出来る
取り敢えずどんな手法があるかと言うと、以下の通り(ワテの勘違いがあるかも知れないが)。
- ASP.NET FormやMVCプロジェクトのweb.configで設定する
- RouteConfigの設定でやる
などである。
web.configに関しては、ASP.NET側で作成されるデフォルト設定に加えて、必要な設定を自分で書き込めば良い。
あるいは、そのweb.configをIISが動いているWindows Server側で、IISマネージャーから編集するなども可能だ。ただし、再びそのプロジェクトを発行すると当然ながら上書きされてしまうので注意が必要だが。
一方、ASP.NET MVCプロジェクトに自動で追加されるRouteConfigの設定を編集する事でも、ルーティング情報を変更出来る(らしい)。
例えばASP.NET MVCプロジェクトにデフォルトで追加されるRouteConfigクラスは以下の通り。
namespace exampleMVC { public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); } } }
上に示すRouteConfigの設定を上手い具合に書き換えれば、ブラウザーのアドレス欄に表示されるルーティング情報の表示形式(要するにアドレス欄に表示される文字列)を独自にカスタマイズ出来る。
ところが、ワテの場合その辺りの知識が乏しい。いろいろ試しているのだが、今一つ良く分からないのだ。
と言う事で、ここではweb.configを使ってhttpをhttpsにリダイレクトする方法を紹介しよう。
恐らくこの手のリダイレクト設定は web.config を使うのが正統的な手法だと思う(ワテの理解)。
httpをhttpsにリダイレクトするweb.config設定
ネットを検索して、いろんなサイトを参考にして作成してみた。
<rewrite> <rules> <clear /> <rule name="httpに来た全部のリクエストをhttpsへリダイレクトする設定" stopProcessing="true"> <match url="(.*)" /> <conditions logicalGrouping="MatchAll"> <add input="{HTTPS}" pattern="off" ignoreCase="true" /> </conditions> <action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" redirectType="Permanent" appendQueryString="false" /> </rule> </rules> </rewrite>
この設定をワテの理解している範囲で解説すると以下の通り。
<clear />
clearする事で、既に定義されているruleが有っても引き継がないようにする。
<rule name="httpに来た全部のリクエストをhttpsへリダイレクトする設定" stopProcessing="true">
新しいrule “好きなルール名” を定義する。
一般には複数のruleを定義しても良いので、その場合には、以下のようにズラズラと記述する。
<rewrite> <rules> <rule name="設定1"> ・・・ </rule> <rule name="設定2"> ・・・ </rule> </rules> </rewrite>
なお、以下の部分は無くても良い。必要に応じて付ける。
stopProcessing="true"
もし上の設定が有る場合には、今実行しているruleにマッチした場合には、複数ruleが有ったとしても、それ以降のruleは実行しないと言う意味だ。
マッチするパターンを正規表現で書く。
<match url="(.*)" />
上のパターンは、リクエストのurlにある全部の文字列にマッチしてその全体をキャプチャーするという意味だ。要するにどんなurlにもマッチする。
conditionsブロックの中に、matchの細かい条件を記述する。
<conditions logicalGrouping="MatchAll"> ・・・ </conditions>
上のように logicalGrouping=”MatchAll” を指定すると、複数の条件を記述した場合にはすべての条件が評価される。つまり、AND条件と言う解釈になる。
今の場合には以下に示す様に一個だけしか条件を書いていないので MatchAllは無くても良いが、普通は複数の条件をズラズラと沢山書く場合が多いので MatchAll を使う事が多い。あるいは MatchAny と言うのもある。これは OR条件だ。
さて、以下の条件によってリクエストのうち https の場合には条件から除外するという意味だ。
<add input="{HTTPS}" pattern="off" ignoreCase="true" />
patternの記述方法は、
pattern="^OFF$"
でも良い。
なお、今の場合、以下の部分は無くても良いと思う。
ignoreCase="true"
つまり、
- http
- HttP
- HTTP
などを文字列として区別しないと言う意味だが、ブラウザーのアドレス欄にHTTPと入れても多分ブラウザー自身が http と小文字に変更すると思うからだ。
でも念のために ignoreCase=”true” を入れておくと良い。
さて、いよいよアクションのブロックの説明となる。
<action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" redirectType="Permanent" appendQueryString="false" />
上記のruleにマッチしたリクエストに対して行う処理がこのアクションの部分になる。
- type=Redirect
- type=Rewrite
があるが、今はリダイレクトをする。
新しく生成するurlを以下のように定義している。
url="https://{HTTP_HOST}{REQUEST_URI}"
先頭には https を付けている。
あとは、
{HTTP_HOST} www.wareko.net {REQUEST_URI} /exampleMVC
なので、それらを連結している。
クエリー文字列が有る場合にはそれを引き継ぎたい場合には
appendQueryString="true"
とするのだが、今の場合はfalseでも良いみたい。
多分、
{REQUEST_URI} /exampleMVC?queryParameter=値1&queryParameter=値2・・・
のように {REQUEST_URI} の中に含まれているので。
その根拠は、以下のマイクロソフトの公式サイトに説明を見付けた。
「URL 書き換えモジュール構成のリファレンス」と言うタイトルのサイトだ。
たとえば、
http://www.mysite.com/content/default.aspx?tabid=2&subtabid=3
という URL が要求され、書き換えルールがサイト レベルで定義されている場合、次のようになります。
ルール パターンは、入力として URL 文字列 content/default.aspx を取得します。
QUERY_STRING サーバー変数は tabid=2&subtabid=3 を含みます。
HTTP_HOST サーバー変数は www.mysite.com を含みます。
SERVER_PORT サーバー変数は 80 を含みます。
SERVER_PORT_SECURE サーバー変数は 0 で、HTTPS は OFF です。
REQUEST_URI サーバー変数 は /default.aspx?tabid=2&subtabid=3 を含みます。
引用元 https://technet.microsoft.com/ja-jp/library/dd939095.aspx
と言う事で、{REQUEST_URI}にはクエリー変数も全部含むのだ。
まとめ
ワテのサイト
www.wareko.net
をSSL化した。
その結果、サイトへのリクエストは
のどちらでも可能になった。
現状では、ワテ自作のASP.NET WEBサイトの殆どはhttpでもhttpsでも問題無く開ける。
従って、それらのWEBサイトはhttpで来たリクエストは全部 httpsにリダイレクトしても良い。
ところが、
はまだSSL対応に出来ていないので、以下のhttpsのアドレスを開くと正しく表示出来ないのだ。
なので、今後、これらの地図サイトもSSL対応にしてhttpsでアクセスしても正常に表示出来るよにしたい。
コメント
この書き方だと
http://example.com/index.html
は大丈夫でしたが
http://example.com/
だとリダイレクトされませんでした。
私の場合clearの行を入れませんでしたのでその影響かもしれませんが。
「あ」様
この度は小生の記事にコメントありがとうございました。
さて、私の場合、このところASP.NET MVCをやる機会が全く無いのでweb.configファイル設定のやり方もすっかり忘れてしまっています。
先日、ASP.NET Coreのバージョン3が正式リリースされましたので、そろそろCoreを使ってMVCサイトを作ってみたいなあと思っています。
その時には、web.configのやり方も思い出せると思いますので何か結果が分かりましたら、再度返信させて頂きたいと思います。
なお、当記事で紹介したやり方はその後、幾つかの改良を加えて私の運営するwareko.netの各MVCサイトで使っています。
具体的には
https://www.wareko.net/exampleMVC/ や
http://www.wareko.net/exampleMVC/
でアクセスできるサイトは、
https://www.wareko.net/exampleMVC/1.0/
https://www.wareko.net/exampleMVC/1.1/
https://www.wareko.net/exampleMVC/1.2/
https://www.wareko.net/exampleMVC/2.0/
https://www.wareko.net/exampleMVC/2.1/ これが最新版
のようにバージョンアップして行きますので
https://www.wareko.net/exampleMVC/
でアクセスした場合には、最新版の2.1のフォルダの内容を表示出来るようにweb.configで設定しています。
このようにしておくと、万一2.1にバグを発見した場合には、web.configを書き換えるだけで2.0に戻せるメリットがありますので割と良い方法だと思っています。