mod_rewriteいろいろ

ポートで判別する

ポート80で来た場合はhttpsにリダイレクト

RewriteEngine on
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

ポート8443に来た場合はhttpにリダイレクト

RewriteEngine on
RewriteCond %{SERVER_PORT} 8443
RewriteRule ^(.*)$ http://%{HTTP_HOST}%{REQUEST_URI} [R,L]

SSLアクセラレーター(LB配下の場合とか)

LBなどで冗長化されている場合は、リダイレクトループになったりしてかなりひどい目に合いました。
LBの機能にも依存しますが、httpヘッダーの情報が通常のアクセスと若干違ってきてしまうので、rewriteの方法も変わります。LB自体をSSLの終端を置く場合にはwebサーバーにポート443で送る必要がなくなるので、8433みたいな通常の非暗号化ポートに送るわけですが、この場合、httpsできたリクエストをhttpにリダイレクトすることになります。が、このリダイレクトはLBの頭(Global IP側)になります。
この場合どうしてだかわからないのですが、%{HTTP_HOST}を削除して%{REQUEST_URI}のみにするとうまくいきました。

RewriteEngine on
RewriteCond %{SERVER_PORT} 8443
RewriteRule ^(.*)$ http://%{REQUEST_URI} [R,L]

プロトコルで判断する

httpをhttpsにリダイレクト

当然アクセスプロトコルで判断も可能です。ただこれはポートではなくプロトコルで見るのでって話しです。httpsがoffだったらhttpsにリダイレクト。

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

httpsをhttpにリダイレクト

RewriteEngine on
RewriteCond %{HTTPS} on
RewriteRule ^(.*)$ http://%{HTTP_HOST}%{REQUEST_URI} [R,L]

とはいえ、全部httpsにしてしまえ!って思いますね。

サブドメイン関連

wwwなしをwwwありのURLにrewriteする

# example.com -> www.example.com
RewriteEngine On
RewriteCond %{HTTP_HOST} ^example\.com$
RewriteRule (.*) http://www.example.com/$1 [R=301,L]

wwwありをwwwなしのURLにrewriteする

# www.example.com -> example.com
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.example\.com$
RewriteRule (.*) http://example.com/$1 [R=301,L]

ドメインからドメインに転送する

RewriteEngine on
RewriteCond %{HTTP_HOST} ^(example\.com)(:80)? [NC]
RewriteRule ^(.*) http://sub.example.jp/$1 [R=301,L]

みたいな感じで書く。

Last update: 2016.09.09 (金)