角待ちは対空

おもむろガウェイン

またこのメンバーで集まってリダイレクトしたいね

nginxでURIを書き換えてリダイレクトしたいときrewriteを使うと思う。

典型的には以下のような感じ。

rewrite '^/images/([a-z]{2})/([a-z0-9]{5})/(.*)\.(png|jpg|gof)$' /data?file=$3.$4. break;

ngx_http_rewrite_modulerewriteディレクティブはURIを書き換えるディレクティブだがリダイレクトも(大体)自動でしてくれる。

第三引数に指定できるフラグはlastbreakredirectpermanentの4種類あるが、なくてもリダイレクトしてくれたりして挙動がよくわからなかったので調べた。


rewrite regex replacement [flag]

rewriteの構文はこんな感じ。渡ってきたURIをregexに従ってreplacementに置き換える。

その際、replacementがhttp://またはhttps://または$schemeで始まる際、フラグに関係なく処理は中断され、redirectフラグが指定された場合と同じ挙動する。

redirectフラグは302リダイレクトを返すフラグなので、結果的にreplacementがhttp://などのスキーマから始まっていた場合302リダイレクトが返ることになる。その際続く処理は中断されるのでわざわざbreakを付ける必要はない。

つまりredirectフラグがなくてもリダイレクトしてくれるのはなぜかというとスキーマ始まりのURLを書いているからであった。

ridirectフラグの説明には

used if a replacement string does not start with “http://”, “https://”, or “$scheme”;

とreplacementがスキーマで始まらない場合に使われると書いてある。

つまり、replacementにスキーマがついているかを最初に考え、次にフラグによってどういう挙動をするかを考えればrewriteの挙動が見えてくる。

lastbreakの挙動は巷に良い解説記事が溢れているので言及しない。permanentは301でリダイレクトが返るフラグである。

blog.yux3.net

sedとperlと部屋とワイシャツと私

MacOSのsed-iオプションのあとに空文字を指定しても(-i'')in-place(上書き)にしつつバックアップファイルは作らないみたいな動作はできない。

sed -i'' -e 's/foo/bar/' test.txt

するとtest.text-eというファイルができて辛い。ちなみに''がなくてもだめ

対してperl

perl -i -pe 's/foo/bar/' test.txt

で期待した挙動になる。

やっぱperlやな!とおもったら

sed -i '' -e 's/foo/bar/' test.txt

のようにスペースを空けると上書きしつつバックアップは取らないとう挙動になる。

-i extension Edit files in-place, saving backups with the specified extension. If a zero-length extension is given, no backup will be saved. It is not recommended to give a zero-length extension when in-place editing files, as you risk corruption or partial content in situations where disk space is exhausted, etc.

特にマニュアルにはスペース開けろって書いてない気がする。-i'.backup' がいけるのでいけると思ってた。

なにはともあれsedには後で謝っておこうと思いました。

blog.yux3.net

年内には埋めたいという気持ちでやってます。

Furl::S3のTIPS100連発

Furl::S3 にはドキュメントに記載されている create_object メソッドの他に create_object_from_file が存在する。前者はファイルハンドルを引数に取るのに対して後者はファイル名を引数に取る。

また create_object_from_file は content type の判定を自動でしてヘッダーに追加してくれる。この機能は create_object メソッドにはない。

ただし判定に使われるモジュールは File::Type で少々古く、 png が image/x-png と判定されたりしてあまり信頼できない傾向にある。

blog.yux3.net