どういうタイトルにするのが適切なのだろうか。イマイチ思いつかなかったのでこんな感じだけど、図にすると、こういうことをしたいとき。
https://www.flickr.com/photos/29619730@N06/4066833638/
実はこれ、8年程前に同じ事を考えていたんだけど、当時はnginxの存在を知らず、当時使っていたApacheでこのような方法を採れるのかどうかすら、このとき結局分からなかった。
https://www.flickr.com/photos/29619730@N06/4066833638/
実はこれ、8年程前に同じ事を考えていたんだけど、当時はnginxの存在を知らず、当時使っていたApacheでこのような方法を採れるのかどうかすら、このとき結局分からなかった。
ふと思ったんだけど、Apacheでこんな感じのリクエストの捌き方って出来るのかな。 http://bit.ly/wvm2V— あのん (@anon5r) 2009年11月2日
最近はnginxをウェブサーバとして使うことが多いのだけど、そういえば、「当時考えていたこれ、nginxのtry_files使えばできるよね?」というのを思い立って、やってみた。
ここでは、上記の画像となるべく同じ構造にして設定を記述していく。
/var/www/dir_a/public_html
以下には下記のファイルが置いてある。- A.html
- B.html
/var/www/dir_b/public_html
以下にも下記の様なファイルが置いてある。- A.html
- C.html
このとき、DocumentRoot が
/var/www/dir_b/public_html
であった場合、通常、下記のリクエストはそれぞれこのようになるはずである。
curl -I http://www.example.co.jp/A.html
-> HTTP/1.1 200 OK
curl -I http://www.example.co.jp/B.html
-> HTTP/1.1 404 Not Found
curl -I http://www.example.co.jp/C.html
-> HTTP/1.1 200 OK
curl -I http://www.example.co.jp/D.html
-> HTTP/1.1 404 Not Found
これをnginxで、下記の様な設定を行うと、上記の図の様な挙動にできる。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
server { | |
listen 80; | |
server_name www.example.co.jp; | |
root /var/www/dir_b/public_html; | |
location / { | |
root /var/www/dir_a/public_html; | |
try_files $uri $uri/ @dirB; | |
} | |
location @dirB { | |
internal; | |
root /var/www/dir_b/public_html; | |
} | |
} |
curl -I http://www.example.co.jp/A.html
-> HTTP/1.1 200 OK
curl -I http://www.example.co.jp/B.html
-> HTTP/1.1 200 OK
curl -I http://www.example.co.jp/C.html
-> HTTP/1.1 200 OK
curl -I http://www.example.co.jp/D.html
-> HTTP/1.1 404 Not Found
ただし、 http://www.example.co.jp/A.html でのリクエストで返ってきているのは
/var/www/dir_b/public_html/A.html
ではなくて、 /var/www/dir_a/public_html/A.html
の方となる。これでA.htmlへのGETリクエストに対して /var/www/dir_a/public_html にあるファイルを割り込ませられる。
B.html は dir_b にはないけど、 dir_a には存在するのそれが返却される。
逆に C.html は dir_a にはないけど、 dir_b にフォールバックしたときに存在を確認できるためこちらも C.html は 200ステータスで返却される。
D.html はどちらにもファイルが存在しないので、そのまま 404 エラーとなる。
この方法によって何が得になるかというと、運用上の都合などで、何らか画像やファイルを所定の場所とは別の所にアップロードして割り込ませることで、サイトの挙動を変更したい、というような使い方ができる。
逆の考えで、dir_aの方にファイルがなければ dir_b の方にフォールバックする、という指定ができる。
8年前の当時は何で必要だと思ったのか忘れてしまったけど。
ちなみに、 try_files の部分で、ファイルがなかったら 404 を返却したい。という意味で
1 | <code class= "hljs nginx" ><span class= "hljs-attribute" >try_files< /span > <span class= "hljs-variable" >$uri< /span > <span class= "hljs-variable" >$uri< /span >/ <span class= "hljs-variable" >@dirB< /span > =<span class= "hljs-number" >404< /span >; < /code > |