web-dev-qa-db-ja.com

nginx:サブフォルダーをサブドメインにリダイレクトする

サブフォルダーをnginxのサブドメインにリダイレクトしようとしています。 http://example.com/~meow/ にリダイレクトしたい http://meow.example.com/ 。私は以下を試しました:

location ~ ^/\~meow/(.*)$ {
    rewrite ^(.*)$ http://meow.example.com$1 permanent;
}

しかし、それは機能しません。それはユーザーディレクトリの私のロケーションブロックによって捕らえられます:

location ~ ^/~([^/]+)/(.+\.php)$ {
    [...]
}

and

location ~ ^/\~([^/]+)/(.*)$ {
    [...]
}

だから、私はこれをどのように行うでしょうか?ああ、私は/ 〜meow /だけをリダイレクトしたい。他のすべてのユーザーディレクトリは変更しないでください。

5
mrm8

このようにネストされたlocationを使用してみることができます

location ~ ^/\~([^/]+)/(.*)$ {
  location ~ ^/\~meow/(.*)$ {
    rewrite ^(.*)$ http://meow.example.com$1 permanent;     
  }
  [...]
}
4
AlexD

静的な場所は、あなたが求めているものに対してより効率的です。 http://wiki.nginx.org/HttpCoreModule#location で4つのルールを読むと、場所^〜が正規表現の場所によって上書きされないことがわかります。また、リダイレクト中に先頭の/ 〜meowを削除したいようです。正しいアプローチは次のとおりです。

location ^~ /~meow/ {
  rewrite ^/~meow(.*) http://meow.example.com$1 permanent;
}

余談ですが、書き換え時にウリ全体をキャプチャする理由はありません。現在のuriはすでに$ uriに保存されています。

rewrite ^(.*)$ http://meow.example.com$1 permanent;

そして

rewrite ^ http://meow.example.com$uri permanent;

alwaysは同じ結果を生成し、2回目の書き換えは短絡した一致であり、とにかくキャプチャしようとしているものがすでに含まれているため、より効率的です。 。

5
kolbyjack

正規表現の場所は、構成ファイルに表示される順序でチェックされ、最初の正の一致が使用されます。つまり、location ~ ^/\~meow/(.*)$は、構成ファイル内の他の2つの場所の上にある必要があります。

1