Case1 www無しドメイン -> www有りドメインにリダイレクト

参考:Apache RewriteCond の基礎知識 | - WEB ARCH LABO {apache_dir}/conf/vhost

<VirtualHost *:80>

...

	<Directory "/opt/blog">
	...
	</Directory>

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{REQUEST_URI} !^/admin/
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

...

</VirtualHost>
  • RewriteEngine On: このディレクティブを書かないとRewriteは動かない。言い換えるとここだけコメントアウトすればRewriteを無効にできる。
  • RewriteCond: この条件に合致(true)したらRewriteRuleにしたがってURLの書き換えをおこなう。
    • 今回の例:サーバのホスト名%{HTTP_HOST} でwww.が先頭にない !^www\.とき。(大文字小文字は区別しない[NC]
    • RewriteCondを複数記述した場合はデフォルトではAND条件になる。ORにしたい場合は末尾に [OR] を指定する。例では2つ目のRewriteCondにおいて /admin のパスはリライトしないように条件を追加。
  • RewriteRule: URLの書き換えルールを書いている。リダイレクトのステータスコードを末尾に記載。
  • 併せてhttpsにリダイレクトしたい場合はRewriteRuleで指定しているプロトコルをhttpsにする。

Case2 www有りドメイン -> www無しドメインにリダイレクト

{apache_dir}/conf/vhost

<VirtualHost *:80>

...

	<Directory "/opt/blog">
	...
	</Directory>

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteCond %{REQUEST_URI} !^/admin/
RewriteRule ^(.*)$ http://%1$1 [R=301,L]

...

</VirtualHost>
  • %1 は RewriteCond で指定している (.*) キャプチャされたパターン。http://www.example.com の場合は example.com が入る。

補足

  • 上記は http に対するリダイレクト設定。https向けには、<VirtualHost *:443> ディレクティブが定義されているファイル)に同じ設定を加える。

Case3 http -> httpsへリダイレクト

{apache_dir}/conf/vhost

<VirtualHost *:80>

...

	<Directory "/opt/blog">
	...
	</Directory>

RewriteEngine On
RewriteCond %{HTTP_HOST} ^(.*)$ [NC]
RewriteCond %{REQUEST_URI} !^/admin/
RewriteRule ^(.*)$ https://%1$1 [R=301,L]

...

</VirtualHost>
  • Case2を若干変えた程度