Apacheでサブドメインwwwへのアクセスをリダイレクト（転送）する、http300番台


http\://www\.ドメイン.com へのアクセスを、http\://ドメイン.comへリダイレクトさせたい時の設定についてです。
DNSで「www\.ドメイン.com」と「ドメイン.com」のAレコードの設定をすでにやってあることが前提です。

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

#####/etc/httpd/conf/httpd.confの編集

```/etc/httpd/conf/httpd.conf
<VirtualHost *:80>
  ServerName ドメイン.com
  DocumentRoot /var/www/html
</VirtualHost>
<VirtualHost *:80>
  ServerName www.ドメイン.com
  DocumentRoot /var/www/www/html
  #下の3行を追加
  RewriteEngine on
  RewriteCond %{HTTP_HOST} ^www\.ドメイン\.com$
  RewriteRule ^/(.*) http://ドメイン.com/$1 [R=301,L]
</VirtualHost>
```


これで、ブラウザでhttp\://www\.ドメイン.com へアクセスすると、http\://ドメイン.comへリダイレクトされます。
RewriteCondに記述した条件が満たされた場合にRewriteRuleへリダイレクト（転送）されます。
RewriteCondは複数指定可能で、複数の条件のAND/ORも指定できるようです。何も書かない場合はANDで、ORの時はORと書かないといけないぽい。

参考サイト
[Apache RewriteCond の基礎知識](https://weblabo.oscasierra.net/apache-rewritecond-base/)


ちなみにcurlを使った場合は下になります。301という結果を返してくれるだけで、リダイレクトはしてくれないです。

```
 $ curl http://www.ドメイン.com/
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>301 Moved Permanently</title>
</head><body>
<h1>Moved Permanently</h1>
<p>The document has moved <a href="http://ドメイン.com/">here</a>.</p>
</body></html>
```

反対に、http\://ドメイン.com へのアクセスを、http\://www\.ドメイン.comへリダイレクトさせたい時は下のように編集します。

```/etc/httpd/conf/httpd.conf
<VirtualHost *:80>
  ServerName ドメイン.com
  DocumentRoot /var/www/html
  #下の3行を追加
  RewriteEngine on
  RewriteCond %{HTTP_HOST} ^\ドメイン\.com$
  RewriteRule ^/(.*) http://www.ドメイン.com/$1 [R=301,L]
</VirtualHost>
<VirtualHost *:80>
  ServerName www.ドメイン.com
  DocumentRoot /var/www/www/html
</VirtualHost>
```
#####ServerAliasを使ってシンプルに設定する
ServerAliasを使えば、VirtualHostタグをいくつも書かずにすみます。

```/etc/httpd/conf/httpd.conf
<VirtualHost *:80>
  ServerName www.ドメイン.com
  DocumentRoot /var/www/html
  #下の4行を追加
  ServerAlias ドメイン.com
  RewriteEngine on
  RewriteCond %{HTTP_HOST} ^www\.ドメイン\.com$
  RewriteRule ^/(.*) http://ドメイン.com/$1 [R=301,L]
</VirtualHost>
```
上の設定では、http\://www\.ドメイン.comへのアクセスを、http\://ドメイン.comへリダイレクトさせます。
ServerAliasでドメイン.comを指定しているので、http\://ドメイン.comへアクセスしたと場合もこのVirtualHostが適用されます。


#####301でリダイレクト（転送）すると、ブラウザがリダイレクトキャッシュする
上記の設定でリダイレクトの挙動をブラウザで確認していた時、最初にブラウザでアクセスして、さらにリダイレクト先を変更して再度ブラウザでアクセスしたら変更が反映されない現象が発生しました。リダイレクト先が最初の設定でしたリダイレクト先のままでした。。curlは変更が反映されていたからブラウザの設定かな。chrome,safari,firefox全てでこの問題が起こりました。

で調べたら、やっぱりありましたね。
[Chromeのリダイレクトキャッシュを一発削除する方法](https://pisuke-code.com/web-how-to-delete-redirect-cache/)
やはりブラウザがリダイレクト情報をキャッシュしているみたいです。リンク記事の方は、apacheではなくphp(サーバサイドのプログラミング)でリダイレクトしているみたいですが、問題は同じですね。
解決方法はブラウザがキャッシュしているだけなので、chromeなら閲覧履歴データの削除でキャッシュされた画像とファイルを削除すればいいです。そうすれば、リダイレクト設定のテストがchromeでもできます。あと、なんか拡張機能でも簡単にできるみたいですね。

けど、実運用の場面を想定したら、ユーザがリダイレクトのキャッシュクリアなんてしないよね。。実運用で頻繁にリダイレクトするなんてないとは思うけど。
そもそも、上でやったapacheのVirtualHostのリダイレクトの設定は301で、301はMoved Permanently（恒久的・永久に移動した）だから、ブラウザがキャッシュするのは当たり前なんだよね。301リダイレクトをするときは、最初にしっかり考えてからしないといけないですね。


で、httpのリダイレクション（Redirection）の300番台のステータスコードを見ましたが、一時的なリダイレクトとして使えそうなのが、302,303,307あたりかなと思って試してみました。

```
  RewriteRule ^/(.*) http://www.ドメイン.com/$1 [R=301,L]
```

RewriteRuleのR=301を302,303,307で試してみましたが、301と違ってどれもブラウザのリダイレクトのキャッシュはされなかったです。

#####参考サイト
[ApacheのVirtualHostでwwwのサブドメインをwwwなしのドメインにリダイレクトさせる](https://designsupply-web.com/developmentlab/2345/)