RequestlyとIISで特定のWebページへのアクセスを日付で制御する

# はじめに

たとえば休日、勉強に集中しようと思ったら、面白そうなユーチューブ動画を見つけてつい見入ってしまったなんてことはありませんか。
そもそも、サイトにアクセスしなければ動画に集中力を削がれないですが、「アクセスしないでおこう」と意識して誘惑を断つにしても、スマホの通知を見るのと同じくらい無意識にアクセスしてしまう習慣がついていては、意識だけで制御するのは困難と言えます。
そこで、システム側で特定のURLへのアクセスを制御しようと思い立ち、本記事を執筆することにしました。
また、常にアクセスしたくないわけではないので、条件に応じた制御ができるように考えました。
本記事では例として、奇数日はユーチューブへのアクセスをブロックし、代わりにHTMLを表示。偶数日は通常どおりアクセス時に指定したURLにリダイレクトする方法を説明します。

# 対応方針

本記事でやりたいことに対して、アクセス禁止の手段としてよく使われる「hostsファイルの書き換え」では、ドメイン名とIPアドレスの対応はできても、日付によって動的に処理を分けることはできません。
このため、Requestlyを使ってHTTPSアクセスを一度ローカルのサーバー（IIS）へリダイレクトし、IIS上で日付に応じた制御を行う構成をとりました。

# 全体構成

* ユーザーがYouTube（【[https://www.youtube.com/】）にアクセス](https://www.youtube.com/】）にアクセス)
* Requestlyのルールで、そのアクセスを `http://localhost/` にリダイレクト
* IISが `Default.aspx` を実行
* ASPのロジックで日付判定

  * 奇数日なら `blocked.html` を表示
  * 偶数日なら `https://www.youtube.com/` へリダイレクト

# Step 1: IISのセットアップ
IIS（Internet Information Services）とは、Windowsに標準搭載されているWebサーバーソフトです。今回はアクセス先を制御するロジックと、HTMLを配置するために利用しました。

1. Windowsの「機能の有効化または無効化」を開く
2. 「インターネットインフォーメーションサービス」以下必要な項目にチェック（画像参考）
3. 設定後、PCを再起動

![Windowsの機能.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1299342/61d3ece6-e82a-49b5-af36-b45d8f9e61a8.png)

# Step 2: HTML/コードの配置

`C:\inetpub\wwwroot\` に以下を置く：

* `Default.aspx`
* `blocked.html`
* `web.config`

## Default.aspx

```csharp
using System;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        int day = DateTime.Now.Day;

        if (day % 2 == 0)
        {
            // 偶数日：youtubeの登録チャンネル画面へ
            Response.Redirect("https://www.youtube.com/feed/subscriptions");
        }
        else
        {
            // 奇数日：ローカルのブロックページへ
            Response.Redirect("blocked.html");
        }
    }
}
```
※ここで設定するyoutubeのURLが、後に設定するRequestlyでのリダイレクト条件と一致していた場合、リダイレクトループが発生するため、ここでは登録チャンネル画面を設定することにしました。

## blocked.html（例）

```html
<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>ブロック中</title></head>
<body>
  <h1>本日は奇数日のため、アクセスできません。作業に集中してください</h1>
</body>
</html>
```

## web.config

```xml
<?xml version="1.0"?>
<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.8" />
    <httpRuntime targetFramework="4.8" />
  </system.web>
  <system.webServer>
    <defaultDocument>
      <files>
        <clear />
        <add value="Default.aspx" />
      </files>
    </defaultDocument>
  </system.webServer>
</configuration>
```

# Step 3: Requestly拡張の導入と設定
RequestlyはたとえばHTTP Interceptor、API Mocking、API Clientといった開発に必要な機能を提供し、様々なシーンで利用できる便利ツールです。今回はこの拡張機能を、特定のURLへのアクセス時はローカルにリダイレクトさせるために利用します。

## 拡張の設定

1. ChromeウェブストアからRequestlyをインストール
2. 「Redirect Rule」を作成（画像参考）
3. Save rule

![requestlyの画面2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1299342/2f27228c-87d3-4f9f-ba2b-18ad7269e813.png)
※調査メモ：可能であればyoutubeからlocalhostへのリダイレクト条件に、「localhostからのアクセス"ではない"場合」という条件が加えられれば、前段で述べたリダイレクトループを回避できたのですが、調査に割いた時間の範囲ではその条件指定の方法は見当たりませんでした。Filterの一つであるPage Domainsが近しいものと思いますが、NOT条件の適用ができるかは不明でした


# Step 4: 実際にアクセスしてみる

試しに`https://www.youtube.com/`にしてみます。
すると、以下のようにlocalhostにリダイレクトされ、さらに条件によって制御されていることがわかります。
記事執筆日は奇数日だったため、ブロック用のHTMLが表示されています。
また、右側に表示されているダイヤログからも、Requestlyが動作していることがわかります。

![アクセス結果.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1299342/0de1a611-e4fe-4f51-93ac-202a4e5d9901.png)


# トラブルシューティング

**Default.aspxが動かない場合**
この場合、Windowsの機能のうち、有効化しておくべき機能が有効化できていない可能性があります。いまいちどWindowsの機能の有効化または無効化を開き、確認してみると解決への糸口がつかめるかもしれません。

# おわりに

今回はRequestlyとIISによって、特定のWebページへのアクセスを日付で制御しました。
動的な条件判定を含めたこの実現方法は、他の用途への応用もできそうです。

本記事が誰かの参考になれば幸いです。