概要
EC-CUBE 2系から3系もしくは4系へのリニューアルの際はURLの構成が変更になります。
その際にSEOやお客さんの利便性を考慮してリダイレクトを設定することがほとんどです。ただ、SSL強制をしている場合に、1回のリダイレクトの予定が意図せず2回リダイレクトが発生することがあります。
意図せず起きるリダイレクトチェーンをなくす設定を記載します。
対象
サイトが動作しているサーバーより前にSSLが終端するサーバー構成が対象です。
AWSでのサイト構成を例にするとCloudfront+ALB+EC2でALBでSSLが終端している場合です。今回はこの例で説明します。
EC-CUBE2系から4系へのリダイレクトで起きること
商品詳細ページのリダイレクト例
.htaccessに以下のような記述で2系から4系へのリダイレクトを記載するとします。そうすると意図せず2回リダイレクトが発生します。
RewriteCond %{THE_REQUEST} \.*\/products\/detail\.php.*\ HTTP
RewriteCond %{QUERY_STRING} ^.*product_id=([0-9]+).*$
RewriteRule ^products/detail.php$ /products/detail/%1 [R=301,L,NE]
リダイレクトが実際どうなっているか
例として商品IDが100番の場合を例としてあげます。以下のようにhttpへのアクセスがあって、httpsへのリダイレクトが発生します。
①https://example.com/products/detail.php?product_id=100
↓ .htaccessによるリダイレクト ※ httpにリダイレクトされる
②http://example.com/products/detail/100?product_id=100
↓ ALBの設定によるhttpsリダイレクト
③https://example.com/products/detail/100?product_id=100
httpにリダイレクトされるのはなぜか
想定は①から③へのリダイレクトですが、.htaccessのあるEC2へはhttpのアクセスで来ているため、明示しない限りhttpでのリダイレクトURLが生成されます。
SSLがどこで終端していることを意識して記載する
【修正後の記述】
ALBでSSLが終端しておりEC2へはhttpでアクセスされるので、リダイレクトの記載にはhttpsを明示します。
RewriteCond %{THE_REQUEST} \.*\/products\/detail\.php.*\ HTTP
RewriteCond %{QUERY_STRING} ^.*product_id=([0-9]+).*$
RewriteRule ^products/detail.php$ https://%{HTTP_HOST}/products/detail/%1[R=301,L,NE]
リダイレクトがどうなるか
EC2でのリダイレクトの生成がhttpsに変わるため想定通りになります。
https://example.com/products/detail.php?product_id=100
↓ .htaccessのリダイレクトでhttpsになる
https://example.com/products/detail/100?product_id=100
※ .htaccessの記述例はあらゆる状況で動くことを想定した例ではありませんので、ご参考にされる場合は十分に確認をお願いいたします。
※ ご利用にあたって生じた損害について一切の責任を追わないものとします。