Apacheのリダイレクト（転送）設定、httpからhttpsとか


##### 書いてある事
Apacheで運用しているWebサイトのリダイレクトを色々と試したので、その時のメモ書きです。
例えば、httpからhttpsへリダイレクトする設定について書いてあるので、既にWebサイトをSSL化してある事が前提です。
主にhttpd.confファイルとssl.confファイルをいじっています。

（*WebサイトをSSL化するにはSSL証明書の導入が必要ですが、正規のSSL証明書で広く使われていて無料のものならLet's Encryptがあります。）

・[Let’s EncryptにSSL証明書の取得の申請し、ウェブサイトをSSL化する【無料で初めてのhttps】](https://it-jog.com/khow/serv/sslbyletsencrypt)
・[Let’s EncryptのSSL証明書を更新する(手動とcronによる自動更新)](https://it-jog.com/khow/serv/renewletsencrypt)
・[自己署名ルート証明書（オレオレ証明書）を使ってssl化、httpからhttps、apache](https://qiita.com/matsu_qiita/items/963867c2365f1d7a365d)

##### 環境
ec2、amazon linux2(centOS7系)
Apache2.4


##### httpからhttpsへのリダイレクト
全てのhttpアクセスをhttpsへリダイレクトするなら、httpd.confファイルに以下を追記します。

```/etc/httpd/conf/httpd.conf
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
```

2行目のRewriteCondは、httpsアクセスでないリクエストを表します。
3行目のRewriteRuleは、HTTP_HOSTはサーバーホスト名（ドメイン名）、REQUEST_URIはurlのドメイン以下のパス(頭に/が付く)を表します。
httpからhttpsへのリダイレクトは301でやっています（R=301）。

##### 参考
[全ページをSSLにする方法(Apache)](https://jp.globalsign.com/support/allssl/552.html)
[[Apache] mod_rewriteの使い方・.htaccessでリダイレクトする]
[Rewrite (URL書き換え)](https://so-zou.jp/web-app/tech/server/apache/settings/rewrite.htm#no1)
->RewriteEngine、RewriteCond、RewriteRuleについて書いてある
(https://agohack.com/mod_rewrite_rule_cond_base/)
->こちらもmod_rewriteモジュールのRewriteEngine、RewriteCond、RewriteRuleについて書いてあります。


##### httpからhttpsへリダイレクト、かつ、httpsのwwwホストからホストなしへリダイレクト

やりたい事は、下表の３つのリダイレクト元urlにリクエストした時に、リダイレクト先にリダイレクトする。

|リダイレクト元（転送元） |リダイレクト先（転送後）|
|:---------------|:---------------|
|`http://www.ドメイン.com` <br>`http://ドメイン.com`<br>`https://www.ドメイン.com` |https://ドメイン.com|

まず、httpd.confファイルを編集して、全てのhttpアクセスをhttpsへリダイレクトする。
下の3行を追記します。

```/etc/httpd/conf/httpd.conf
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
```

次に、ssl.confファイルを編集して、`https://www.ドメイン.com`を`https://ドメイン.com`へリダイレクトします。下の4行を\<VirtualHost _default_:443>タグ内に追記します。
（下は301リダイレクトの場合。302でリダイレクトしたいなら置き換える）

```/etc/httpd/conf.d/ssl.conf
# ホストwwwからホスト無しへリダイレクト
RewriteEngine On
RewriteCond %{HTTPS} on
RewriteCond %{HTTP_HOST} ^www.ドメイン.com$
RewriteRule ^(.*)$ https://ドメイン.com%{REQUEST_URI} [R=301,L]
```

##### `http://www.ドメイン.com`から`https://ドメイン.com`へ直接リダイレクトする

上の設定でも、`http://www.ドメイン.com`から`https://ドメイン.com`へリダイレクトしますが、`http://www.ドメイン.com`->`https://www.ドメイン.com`->`https://ドメイン.com`と、リダイレクトを２回しています。

これでも別に構わないと思いますが、直接リダイレクトする設定をしてみます。
1つ目のVirtualHostタグは、www.ドメイン.com以外のhttpアクセスをhttpsへリダイレクトし、2つ目のVirtualHostタグで、`http://www.ドメイン.com`から`https://ドメイン.com`へリダイレクトしています。

```/etc/httpd/conf/httpd.conf
#ファイルの最後に追加
RewriteEngine on

<VirtualHost *:80>
  ServerName any
  RewriteCond %{HTTPS} off
  RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</VirtualHost>

<VirtualHost *:80>
  ServerName www.ドメイン.com
  RewriteCond %{HTTPS} off
  RewriteRule ^(.*)$ https://ドメイン.com%{REQUEST_URI} [R=301,L]
</VirtualHost>
```


##### その他の参考サイト
[httpからhttpsにリダイレクト、www有無のリダイレクト方法（mod_rewrite）](https://knowledge.cpi.ad.jp/howto-cpi/242/)

[WEBサーバー(Apache)で直IPアドレスでのアクセスを禁止/リダイレクトする方法](https://dbit.jp/articles/apache-ip-direct-disable)

[IPアドレスをドメイン名にリダイレクトする方法](https://hacknote.jp/archives/54595/)

[httpアクセスをhttpsへ強制リダイレクト（Virtualhost環境下での個別設定）](https://ygg-tech.com/2019/02/redirect_http_to_https_for_virtualhost_env/)
->二つ目のディレクティブは、バーチャルホストとして定義されていないServerName（例えばIPアドレスなど）でのアクセスは拒否するというものです。

[Apache 2.4のhttpとhttpsでIPアドレスや違うFQDNによるアクセスを拒否する](https://www.eripyon.com/mt/2019/01/apache_http_https_ipaddress_access_reject.html)