◉RORK LABEN
●GPT-6.1 SOL — Rork のモデルメニューに追加(09-29)。Low/Medium/High を選べ、Pro・Max に含まれます●SONNET 5.5 — UI づくりが得意で、Sonnet 5 より出力が速いモデルが選べます(09-28)●SDK 58 — Beta が 09/15 から。stable の案内はまだなく、Expo Go でのプロジェクト実行は 09/03 からログインが必要です●WIDGET — iOS のウィジェットが本番ビルドだけ真っ黒になる原因を追った報告が出ています●OBSERVE — EAS Observe がネイティブクラッシュも記録します(SDK 57.0.21 以降・10/07)●NEW — 起動広告が、背面から戻った回にしか出ていませんでした。「前面に戻った」合図が、…●GPT-6.1 SOL — Rork のモデルメニューに追加(09-29)。Low/Medium/High を選べ、Pro・Max に含まれます●SONNET 5.5 — UI づくりが得意で、Sonnet 5 より出力が速いモデルが選べます(09-28)●SDK 58 — Beta が 09/15 から。stable の案内はまだなく、Expo Go でのプロジェクト実行は 09/03 からログインが必要です●WIDGET — iOS のウィジェットが本番ビルドだけ真っ黒になる原因を追った報告が出ています●OBSERVE — EAS Observe がネイティブクラッシュも記録します(SDK 57.0.21 以降・10/07)●NEW — 起動広告が、背面から戻った回にしか出ていませんでした。「前面に戻った」合図が、…
記事一覧/アプリ開発
◇ アプリ開発/2026-10-16中級

壁紙の解像度の振り分けを 301 にするか、内部リライトにするか。同じホストの中なら、URL を変えない道を選びました

同じホスト内で画像の解像度を振り分けるとき、301 と内部リライトのどちらを選ぶか。nginx で両方を動かして往復回数と挙動を並べ、ルールの並び順の罠と確認用スクリプトまで、手元で確かめた記録です。

画像配信nginx301リダイレクト内部リライトキャッシュ4

✦ プレミアム記事

壁紙アプリの画像配信を整えていた日のことです。アプリは sunset.jpg?w=640 のように、欲しい幅を付けて画像を呼びます。サーバー側には、幅ごとに分けたフォルダがあります。この二つをつなぐ振り分けを、301 で書くか、内部リライトで書くかで手が止まりました。

どちらでも「画像は出ます」。だからこそ、選んだ理由を言葉にしないまま進めてしまいやすい箇所です。結論を先にお伝えします。同じホストの中で、呼び出し側に知らせる必要がない振り分けは、URL を変えずに済ませるのがよい、と考えています。 以下は、その判断を手元の nginx で再現し、両方を実際に動かして確かめた記録です。

何を振り分けたいのか

前提を一枚にそろえます。

呼ばれる URL実際に返したいファイル
/img/sunset.jpg?w=640/img/w640/sunset.jpg
/img/sunset.jpg?w=1280/img/w1280/sunset.jpg
/img/sunset.jpg(指定なし・想定外の値)/img/sunset.jpg(元画像)

検証用に、640 幅は 2,000 バイト、1280 幅は 8,000 バイト、元画像は 30,000 バイトのダミーファイルを置きました。バイト数を変えておくと、どのファイルが返ったかが一目で分かります。

301 で書いた版

最初に思いつくのは、こちらです。

# A: 301 で振り分ける
map $arg_w $res { default ""; "640" "w640"; "1280" "w1280"; }
 
location ~ ^/a/img/(?<f>.+)$ {
  if ($res = "") { return 301 /img/$f; }
  return 301 /img/$res/$f;
}

curl で見ると、こうなります。

$ curl -si "http://127.0.0.1:8081/a/img/sunset.jpg?w=1280" | sed -n '1p;/^Location/p'
HTTP/1.1 301 Moved Permanently
Location: http://127.0.0.1:8081/img/w1280/sunset.jpg

リダイレクトを追わせると、num_redirects は 1、つまり画像を一枚取るのに往復が二回です。アクセスログも、同じ画像につき二行ずつ増えます。300 回呼んだログでは、301 の行がちょうど 303 行並びました(動作確認の数回を含みます)。

もう一つ、見落としやすい点があります。HTTP の仕様(RFC 9110 の 301 の項)では、301 は既定でキャッシュしてよい応答として扱われます。ブラウザは「この URL はあちらへ移った」と覚えます。振り分けの規則を後から直しても、覚えた側にはすぐ届きません。確認をシークレットウィンドウで行うのは、そのためです。ここは仕様の記述に基づく説明で、私の環境で何日覚えるかまでは測っていません。

✦

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
✦自分の画像配信が「URL を変える振り分け」と「URL を変えない振り分け」のどちらになっているかを、curl 一本で見分けられるようになります
✦解像度ごとの振り分けを if なしの map と rewrite で組み、想定外の指定値には元画像を返す設定をそのまま持ち帰れます
✦301 を一度出してしまうと、ブラウザや CDN が覚えて直らなくなる事故を、公開の前に防げるようになります
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Rork Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • ✦コピー&ペーストで使える実装コード付き
  • ✦毎日新しい上級ガイドを追加
  • ✦¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

◇ アプリ開発2026-10-15
購読が切れても広告が戻りませんでした。「いま ad-free でなければ false」と書いていた、判定の向きを直した記録
購読が失効しても広告非表示のままになる不具合の原因は、判定の向きの逆転でした。二系統の購入確認を待って合成し、失敗した回は前回を保つ部品を、手元で動かして確かめた記録です。
◇ アプリ開発2026-10-15
adjustsFontSizeToFit で特定の1行だけ極小になるとき、疑うのは文字列ではなく枠の高さです
一覧の10行目だけ文字が4ptまで縮む。データも文字列も正常なのに起きる iOS の症状を、Yoga の丸めと縮小判定のソースで確かめ、Node で再現率を数えた記録です。
◇ アプリ開発2026-10-15
EAS Build だけ「No matching variant」で落ちるとき、まず疑う手元の android/build
手元の Gradle は通るのに、EAS Build の Android だけが「No matching variant of project」で止まる。GitHub の報告を読み比べ、Windows で生成した autolinking のキャッシュが Linux のビルド機へ渡っていた経路と、ビルドを投げる前に確かめる診断スクリプトをまとめました。