[Nginx] 任意のクエリストリングのみdocument_rootを切り替える方法

2022年11月28日

テクノロジー

eyecatch webサイトで、任意のクエリ値の時だけ、同じサーバーの別のディレクトリをrootにしたい場合の設定をしたので、その備忘録です。 ホント、この設定って、非常にニッチであることは理解してますが、Nginxで検索しても全くマッチする検索結果が得られなかったので、自分でいろいろ試してようやくできた結果です。 そして、実際にどういう場合を想定しているか、この時点でよくわからない人の為に、その状況も含めた環境や背景なども明記しておきたいと思います。

設定に至る背景

某月某日、いきなりwebサイトをリニューアルしたいと考えたと同時に、それまで使っていたブログシステムをGoogleBloggerに切り替えたくなりました。 いや、これ思考順番が逆ですね。 これまで使っていたブログシステムがサーバーの容量を圧迫してきているので、まずブログシステムをほぼ無料で使えるGoogleBloggerに切り替えようと考えて、移設作業をしていました。 SEOを意識して、メタタグのcanonical値を埋め込みながら、クローラー対策を行っていたんですが、同時にwebサイトもリニューアルしたくなってきました。 (同時にGoogleBloggerへのリダイレクト処理を実施しています) webサイトをリニューアルする時に、ブログ記事は、GoogleBloggerに全て移設できたので、それはなるべくリニューアル対象から外したいと思い、ブログアクセスのクエリの場合のみ、リニューアル前のフォルダを表示するようにNginxで処理をしたいと思いました。 そちらにアクセスが無くなった段階で、今回行ったNginxの設定を切り戻せばいいだけなので、これは最善の対応と考えたんですね。 ちなみに、リニューアル前のサイトでは、リダイレクト処理を行っているので、実際に旧サイトが表示されるわけではないんですよね。

Nginxの設定

わかりやすく、before-afterで書きます。 root /var/www/html; location / { } location ~ \.php$ { fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass unix:/run/php/php7.4-fpm.sock; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; } root /var/www/html; location / { ## redirect if ( $args ~ "b=(.+?)" ){ root /var/www/html_old; } } location ~ \.php$ { ## redirect if ( $args ~ "b=(.+?)" ){ root /var/www/html_old; } fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass unix:/run/php/php7.4-fpm.sock; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; } 追加した箇所に、コメントと色変更をしたので、この点を加えました。

ポイント解説

1. 正規表現の条件分岐で登録

if ( $args ~ "b=(.+?)" ){...}の書き方で、クエリストリングの正規表現としてセットする。 この時に、if文の()の中のスペースに注意してください。 if($args ~ "b=(.+?)"){ このように書いてしまうとnginxではerrorになります。 適度なスペースが必要なんです。 if ( $args ~ "b=(.+?)" ){ このように書きましょう!

2. 記述場所

location /と php設定のどちらにもroot変更記述をする必要があります。 この点で一番時間を費やしたんですが、location / のみで対応できると思っていたら、グローバルのroot記述がそのスコープ内でしか有効にならないからですね。

3. テストをしっかりする

Nginxは設定のテスト機能を持っているので、必ず設定変更したら次のコマンドを実行しましょう。 $ nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful このように表示されれば、テスト合格です。 ちなみに、失敗した時は、次のように表示されます。 nginx: [emerg] unknown directive "if($args" in /etc/nginx/conf.d/domain.conf:16 nginx: configuration file /etc/nginx/nginx.conf test failed これは、if文に適度なスペースが入っていない場合のエラーですね。

あとがき

webページをリニューアルすると、気分も一新できて、いろいろな思考の切り替えができるので、たまにですが、こういう作業が発生してしまいます。 こんな時に、なるべくスムーズに移行できるwebサイトの構成を事前にしておくという事も重要なのかもしれませんね。 ちなみに、今回は、自分でスクラッチ構築したwebサイトの引っ越しだったのですが、wordpress版のブログの引っ越しもこの少し前に行っていて、 そっちも、いろいろな技術ポイントがあったので、こっちの方がニーズがあるような気がしてきた。 次回はそのうちそちらもブログに書いて備忘録にしておくことにしますね。 というわけで、新しくなった、webサイトを存分に御覧ください。 https://myntinc.com