だ。ログ。

開発とかスノボとかやきうとか。

サイトの強制SSL

Let's Encryptが広まり始め、ウチもサイトSSL対応したい!と言うサイトも多くなってきた。
.htaccessで強制的にSSLにリダイレクトするのが手っ取り早い。

RewriteEngine On
RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R]

ただし、SSLTerminationとか使ってると443ではなくなるので注意。
って言うかそこまでの技術があるなら、最初からSSLを視野に設計してると思うからあまり意味がないかも。

EC-CUBE3がELB配下のEC2サーバーにある場合の管理ページのアクセス制限を行う

かなり限定的な構成ではあるがELBの下にEC2にEC-CUBE3がインストールされている。
しかもELBにSSLをインストールしているSSL Terminationを利用している場合
そのままEC-CUBEをインストールし、管理画面のアクセス制限をしてもアクセス制限が出来ない。

過去の記事にも掲載したが、一旦ELBを経由しEC2に到達するのでアクセス元はELBのIPアドレスになるのだ
index.phpで$_SERVERをダンプする

[REMOTE_ADDR] => ELBのIPアドレス

と出てしまっている。
この為、ELBのIPアドレスを許可するとELB経由のアクセスは許可=全許可と言う事で意味がない。
しかしREMOTE_ADDRを他のモノに変えるとどこでどう使っているかが不明な為、あまりコレをいじるのはよろしくない。と言う事で以下

/src/Eccube/Application.php

                if (count($allowHost) > 0) {
                    if (array_search($app['request']->getClientIp(), $allowHost) === false) {
                        throw new \Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException();
                    }
                }

この getClientIpはREMOTE_ADDRを取得しに来ている。
そして、ここで許可ホストに一致しなければエラーに飛ばすと言う処理を行っているので以下に変更

		$realip = $_SERVER['HTTP_X_FORWARDED_FOR'];
                if (count($allowHost) > 0) {
                    if (array_search($realip, $allowHost) === false) {
                        throw new \Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException();
                    }
                }

リアルのIPアドレスはどれよ。って事を$_SERVER変数から確認し、そのIPアドレスに判定を書き換える。
多分EC-CUBESSL Terminationを想定していない造り、って言うかそう言う使い方するもんじゃねーからコレ。と言われかねないが
ELB経由のEC2でEC-CUBEを使う人がハマる所かと。

EC-CUBE3のindex_dev.phpで出る変数 is not definedの消し方

これはtwigに設定された変数すべてに言えるのだが、変数が未定義で同一のテンプレートを使った場合によく見かける。
別にエラーではないし、他にデバッグしたい事があるのに、index_devでこのエラーを指摘されてよくイラつく。

例 コントローラ

        return $app->render('Hoge/fuga.twig', array(
		'hogehoge' => $hoge,
        ));

この$hogeが明示的に設定されていれば問題にならないが、PHPの性質上未定義でもエラーになる事がないので$hogeの有無に関してを制御する事はない。
もっと言えば変数$hogeを全ページに設定するのはもっと面倒くさい。
と言うワケでテンプレートをに以下の判定を入れる。

{% if hoge is defined %}
{% endif %}

hogeと言う変数が定義されていれば」と言う条件を加える事で、未定義の場合は処理をスキップする。
index_dev.phpを利用してのデバッグ時に is not definedはこれで解決できる。

EC-CUBE3のデバイス判定

いつも忘れるので書いておく。

{% if app['mobile_detect'].isMobile %}
    スマホ、タブレット
{% else %}
    PC
{% endif %}

スマホ、タブでスタイルを変更する事が多いのでtwigの機能で持っているisMobileを使う。
この他に isTabletなんてものもある。

youtube埋め込みタグのレスポンシブ対応

あまりcssとhtmlに詳しくないので、とりあえずコピペできるようにする。

	<div>
		<iframe src="//www.youtube.com/embed/hogehogehoge" frameborder="0" width="560" height="315" allowfullscreen></iframe>
	</div>

iframeの典型的な埋め込みコード、このままコピペすればyoutube自体は参照が可能。
ただし、スマホで観た場合はiframeのサイズになってしまうので横幅がはみ出してしまいレスポンシブ対応が上手くいかない。

	<div style="position:relative; width:100%; padding-top:56.25%;">
		<iframe src="//www.youtube.com/embed/hogehogehoge" frameborder="0" width="560" height="315" allowfullscreen style="position:absolute;top:0;right:0;width:100%;height:100%;"></iframe>

直接スタイルに書いてしまっているが、スタイルでまとめればこのまま使えると言う感じ。

EC-CUBE3で現在のページを調べる

共通ヘッダーだけど見出しだけ変えたい。とか有るので結構必要となる「現在のページ」
$_SERVERから見るだけでなくEC-CUBEの機能でも備えている。

	$request = $app['request_stack']->getMasterRequest();
	$now_page = $request->attributes->get('_route');

$now_pageに現在表示されているページ名を取得できる。
変数の値によってタイトルを設定すれば動的にページの見出し等で使える。

EC-CUBE3でHTMLタグを使う

よく忘れる。
ページに設定された変数で特にありがちなのはフリーエリア部分。
そのままだとHTMLタグの囲み文字が&から始まる文字列に変換される。

{{ Product.free_area }}

これを

{{ Product.free_area|raw }}

とrawurlencodeを設定するとHTMLタグが適用される。