#rewriteこんにちは角田(tsunoda)です。今回はapacheからnginxへの移行の際のrewriteについてです。最近さわっていて結構ハマったので、おさえるべきポイントをご紹介します。自分も調べながらやったのですが、お困りの方が多いように思えました。nginxへ移行をお考えの方、基本的な事ですがご参考にして頂ければ幸いです。設定ファイルにrewrite文を書く事で、URLをリダイレクトすることができます。apacheの.htaccessが使えません(^o^)/.htaccessの中身はすべてnginxの設定ファイルに変換して設定する必要があります。鵜呑みにすることなかれ。...それでは押さえるべきポイントをご紹介します。優先順位locationではURLに応じた様々な制御を行うことができます。locationの優先順位は以下のようになっています。次のような要求がきた場合、こんな判定になります。E自分はここら辺からすでに魔術にかけられていたようです。この優先順位によって、狙ったlocationが別のlocationで捕まっていたりするので要注意。rewriteが効いてない場合なんかはlocationの優先順位を見ることが解決の鍵になるかも。大きな正規表現は使わない方が良いですね。apacheでは見れているのにnginxでは見れない404だ!nginxでphpがダウンロードされちゃう!リダイレクト先のlocationを作って、そこに直接fastcgiの設定を入れてあげます。この設定が効いていない事が多いです。develop;}locationごとに毎回設定を書くのは面倒なので、fastcgiの設定ファイルを別で作り(fastcgi-php.txt.txtとか)、それをincludeする形にするとさっぱりしますね。/path/to/nginx/fastcgi-php.txt.txt}try_filesNginxの設定にて、静的なファイルと動的なURLを振り分けたいことがあります。try_filesを利用すれば、指定した順番で確認と転送を実施してくれます。以下の順番で確認してくれます。URLのパスにファイルがあるか($uri)1がなかった場合、URLのパスにディレクトリがあるか($uri/)1も2もなかった場合、指定したロケーションへ行く。/hogehoge/sample;}リダイレクトする前のURLのまま、リダイレクト先のphpなどを実行したい場合に使えます。URLはhttps://sample.jp/sampleのまま、https://sample.jp/hogehoge/sample/index.phpを読み込ませたい。/hogehoge/sample/$args;}こんな感じで。内部リダイレクトを実行した場合、すべてサーバー内部で処理されるため、表にその痕跡は一切現れず、クライアント側からは書き換えが行われたことを知ることは出来ません。「あれー、try_filesしてるのに内部リダイレクトされないな。try_filesが効かない..」そう思い、try_filesの記述を書き直したりして見事に自分はハマりました。try_filesは基本的に動いてくれてます。nginxをreloadする度に彼はtryしてくれています!try_filesが動かない場合はどこかでそのlocationが優先順位によって捕まっている事が多いです。リダイレクトフラグリダイレクトフラグの指定によって、ステータスコードを変えることができます。指定できるのは下記のものとなっています。locationを再検索します。別のlocationにあるrewriteディレクティブは実行されます。▼BREAKrewriteディレクティブの処理を停止し、locationの検索を停止します。別のlocationにあるrewriteディレクティブは実行されません。▼PERMANENT恒久的なリダイレクトをするときに使用します。HTTPのステータスコードは「301」を返します。▼REDIRECT一時的なリダイレクトをするときに使用します。HTTPのステータスコードは「302」を返します。こんな感じになります。curlコマンドでアクセスしてみましょう。clear301で返ってきてリダイレクトしました。}}クライアントとロードバランサーの間で使用されたプロトコルを判別する「X-Forwarded-Proto」このリクエストヘッダーを使用することでリダイレクトループを発生させずにhttpをhttpsにリダイレクトさせることができます。組み合わせて使う以上のことが主なエラー解決の鍵であることが多いです。これらを組み合わせて、エラー箇所の対処をしたりします。リダイレクト、かつ内部で/hogehoge/sample/を読み込みたい。/path/to/nginx/fastcgi-php.txt}これでようやく表示できるようになりました。/sample(.*)$が来たら、/hogehoge/sample/のphp、cssなどを見る。/sampleが来たら/sample/tsunoda/へリダイレクト/sample/tsunoda/で内部リダイレクト/hogehoge/sample/のphpにfastcgiの設定をincludeしてあげて表示する。こんな感じで組み合わせると表示できます。まとめlocationの優先順位によってどこかで引っ張られていたり、fastcgiの設定が通ってなかったり、どうにもtry_filesが効かないなと思ったら他の箇所のlocationに引っかかってたり。急にできて、え!何で!?...あーそういう事か!なんて事もあったり。phpの読み込み・try_files・リダイレクトフラグポイントを頭に入れておくとアプローチしやすいかなと思います。