ifとtry_filesとlocationと | no news.

ifとtry_filesとlocationと

どうもwordpressをnginxで動かす時によくやる設定があるようだ。よく調べるとnginx入門のapacheからnginxに移行するときの
wordpress編に載っていたものだ。

if (!-e $request_filename){
rewrite ^/(.+)$ /index.php?q=$1 last;
}

これなんだが、locationディレクティブとの組み合わせでハマった。

やりたいことは特定のURL(http://s.no-ne.ws/mysite/)にアクセスした時は特定のディレクトリを表示させたいだけ。
試しに設定ファイルを以下のようにしてみた。

server {
listen 80 ;
server_name s.no-ne.ws ;
root /var/www/no-ne.ws/s;
index index.html;
access_log /var/log/nginx/s.no-ne.ws.access.log;
error_log /var/log/nginx/s.no-ne.ws.error.log debug;

location /mysite/ {
alias /var/www/test/ ;
}

if (!-e $request_filename){
# 通常は下記のように index.phpに引数を付ける形だが
# 今回は簡略化してrewrite.htmlにリダイレクトする
#rewrite ^/(.+)$ /index.html?q=$1 last;
rewrite ^/(.+)$ /rewrite.html last;
}
}

特定のディレクトリはこちら。

$ ls /var/www/test/
index.html
$ cat /var/www/test/index.html
mysite
$

rewrite.htmlはこちら。

$ cat /var/www/no-ne.ws/s/rewrite.html
rewrite
$

ここまでの設定で

  • http://s.no-ne.ws/mysite/ にアクセスした場合、mysiteと表示される
  • http://s.no-ne.ws/nopage/にアクセスした場合、rewriteと表示される

と表示されるはずである。が。。。実際に試してみると

  • http://s.no-ne.ws/mysite/ にアクセスした場合、rewriteと表示される
  • http://s.no-ne.ws/nopage/にアクセスした場合、rewriteと表示される

エラーログを見ると

2015/05/02 13:38:18 [notice] 14437#0: *65867 "^/(.+)$" matches "/mysite/", client: xxx.xxx.xxx.xxx, server: s.no-ne.ws, request: "GET /mysite/ HTTP/1.1", host: "s.no-ne.ws"
2015/05/02 13:38:18 [debug] 14437#0: *65867 http script copy: "/rewrite.html"
2015/05/02 13:38:18 [debug] 14437#0: *65867 http script regex end
2015/05/02 13:38:18 [notice] 14437#0: *65867 rewritten data: "/rewrite.html", args: "", client: 153.232.77.9, server: s.no-ne.ws, request: "GET /mysite/ HTTP/1.1", host: "s.no-ne.ws"

よく見ると "^/(.+)$" matches "/mysite/"とあり、/mysite/はlocationの設定が効いておらず、

if (!-e $request_filename){
rewrite ^/(.+)$ /rewrite.html last;
}

の^/(.+)$が優先されるようです。今回は指定されたファイルがなかったらリライトなので、try_filesを使うようにしました。意味合い的には一緒だろう。

server {
listen 80 ;
server_name s.no-ne.ws ;
root /var/www/no-ne.ws/s;
index index.html;
access_log /var/log/nginx/s.no-ne.ws.access.log;
error_log /var/log/nginx/s.no-ne.ws.error.log debug;

location /mysite/ {
alias /var/www/test/ ;
}

try_files $uri /rewrite.html;
}

この設定で試したところ、無事に/mysite/には「mysite」が、/nopage/には「rewrite」が表示されるようになりました。

スポンサーリンク
レクタングル大

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

スポンサーリンク
レクタングル大