サーバ関連

AWSでロードバランサー(ELB)を使っている環境で「.htaccess」を使って一時的に「メンテナンス中」表示をするが、特定IPアドレスを除外したい(特定IPアドレスからは普通に見えるようにしたい)、というお話。
...
RewriteCond %{REMOTE_ADDR} !=192.168.0.123
...

としても効かない。
なぜ?と思って環境変数を調べると…うん。$_SERVER['REMOTE_ADDR']に自分のIPアドレスは入らない。
探してみると$_SERVER['HTTP_X_FORWARDED_FOR']の中に入っている。
じゃあ、と思って先の.htaccessを書き換えたがやっぱり効かない。
教えてグーグル先生!
…見つかった。
php:$_SERVER[“REMOTE_ADDR”]

.htaccess:RewriteCond %{REMOTE_ADDR} !^××.××.××.××

ELBの場合

PHP:$_SERVER[“HTTP_X_FORWARDED_FOR”]

.htaccess:RewriteCond %{HTTP:X-Forwarded-For} !^××.××.××.××

ありがとうryoさん。コメント機能がなかったのでここでお礼を言わせていただきます。
環境変数名が違ったんだね…。
サーバでは「HTTP:X-Forwarded-For」だったのが、PHPでは「HTTP_X_FORWARDED_FOR」に変換されちゃってたんだー、そういうものなのか知らなかったなー。
※apacheでヴァーチャルホストな場合の話です
掲題の通り、httpのアクセスをhttpsにリダイレクトさせたい。
といっても、Let’s Encryptを使うと自動で設定してくれますね。
↓こんな感じ。
<VirtualHost *:80>
ServerName example.com
RewriteEngine on
RewriteCond %{SERVER_NAME} =example.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>


でも、コレって「Redirect」ディレクティブを使えばもっとシンプルに書けるんでないの?
<VirtualHost *:80>
ServerName example.com
Redirect permanent / https://example.com/
</VirtualHost>


うーん、実際にやってみると同じ挙動のように見えるんだけど。
なにか問題があるのかなー?

「Redirect」ディレクティブが入っている「mod_alias」のマニュアルにこう書いてある。
mod_alias は簡単な URL 操作向けに設計されています。 より複雑な操作、クエリーストリングの操作には、mod_rewrite で提供されるツールを使用してください。

今回のは『簡単な URL 操作』にあたるのでRedirectディレクティブを用いるべき、と思うのだけど…。

教えて詳しい人!
…って、こんなところで言っても誰も教えてくれないだろ(^_^;
systemctl とか service とか /etc/rc.d/init.d/ 的な話です。

結論から言うと、

『挙動が明らかな場合のみ、reloadを使いましょう。』


続きを読む
またしても罠にハマった…orz(死語(死語(ry

poppler-utils をインストールすると pdftotext でPDFのテキストを抽出できるようになる。
これは色んな記事があるのでここでは触れません。

えーと、結論から言うと、下記でできます。
pdftoppm -jpeg hoge.pdf hoge

これで、下記のようにページごとに出力される。
  hoge-1.jpg
  hoge-2.jpg
  hoge-3.jpg
  ...


以下、恒例の蛇足。。。


続きを読む
下記は某ソニーペイメントサービス様の記事より引用したもの。
これは絶対にコピペして使わないでください!
ErrorDocument 503 /maintenance.html

< IfModule mod_rewrite.c >
RewriteEngine On
RewriteCond %{REQUEST URI} !=/maintenance.html
RewriteCond %{REMOTE_ADDR} !=xxx.xxx.xxx.xxx
RewriteRule ^.*$ - [R=503,L]
< /IfModule >

< IfModule mod_headers.c >
Header set Retry-After "Sun, 1 Apr 2018 7:00:00 GMT"
< /IfModule >


『「xxx.xxx.xxx.xxx」の部分は管理者のIPアドレスです』などと、いかにもコピペすれば使えますよー的に書かれていますが、鵜呑みにするとつまづきます。
もう、わざとやっているとしか思えない、罠が存在するのです。
まずはじめに、タグ開始文字の後ろとタグ終了文字の前にスペースが挿入されています。
これだけなら、まあ、単純なミスだなぁ、と思ってそのまま終わっていたと思う。
が、もう一つ悪質な罠が…。
それは「アンダースコアが空白になっている」です。
具体的には「REQUEST_URI」が「REQUEST URI」になっているのです。
これ、見た目ではわかりにくく、ついに間違いに気づくことができませんでした。。
そこで別サイトを参考に.htaccessを作り、事なきを得たのですが、、、
この正常稼働したものと、テキスト比較ツールを使って比較してもなお分かりにくく、その場では気づくことができず、他にも動作確認しなければならないので後回しにしていたのです。
んで、後日落ち着いてテキスト比較ツールで見ていると、どうやら前述の箇所が違っているらしい。
改めてテキストエディタで開いて良く見ると、「ここ空白になっとるやないかーい!」と、ようやく気づいたという次第。

もうね、こんな使えないものをあたかもコピペで使えますよ的に載せている企業なんて、信用できません。もし決済代行導入の機会がありました際には、今回の件、参考にさせていただきます。


もっとも、悪いのは動作確認を怠った私です!
私のような迂闊な人間に警鐘を鳴らすためにあえて罠を仕込んだのかもしれない…。
ただ、それを超大企業(のグループ企業)がやっていいものか、疑問ですが。。

うーむ、いつものことながら、なんだか尻窄み。。。