0

Nginxで次のことを実現したいと思います。

/product/view/32 ---> /product/view?id=32
/product/add/32 ----> /product/add?id=32
/product/edit/32 ---> /product/edit?id=32
/post/view/32 ---> /post/view?id=32
/post/add/32 ----> /post/add?id=32
/post/edit/32 ---> /post/edit?id=32
/foo/bar/32 ---> /foo/bar?id=32

特定のファイルを念頭に置いている場合は、次のように書くことができます。

rewrite ^/path/(.*)$ /path/file.php?id=$1 last;

しかし、特定のパスが必ずしもわからない上記のケースをどのように処理しますか?

4

1 に答える 1

0

あなたは3つのパスとして与えます、そしてそれらはすべて共通のパターンを持っています/product/、そしてあなたはあなたがあなたのパスの残りについて考えると仮定できるように特定のパスを知る必要はないと言っています。次に、これを変更できるのはview/32、、/add/32または/edit/32です。この場合、次のようなrewriteディレクティブを試すことができます。

rewrite ^/product/([a-zA-Z]+)/[0-9]+) /product/$1?id=$2 last;

ここでは変数として、パスとID値$1の間にあるものを取得します。/product/変数は、元のパスの最後にある数字として$2表されます。id


質問の変更によると、書き換え後に変更されることのない一定のパスが常に存在するように見えます。たとえば、次のようになります。

メインパスがで始まる場合/product/addは、常にそれをとして書き直します。そう/product/addである場合は、/post/addにも書き直され/post/addます。変更されるのは、IDをから/32に変更することだけです?id=32。この場合、最初の解決と同じ方法でそれを達成できますが、少し変更を加えるだけです。

rewrite ^/([a-zA-Z]+/[a-zA-Z]+)/([0-9]+)$ /$1?id=$2; last;

ここでは、変数として、、、、およびパターンに一致する他のすべてのケースが$1設定さproduct/viewれます。変数の場合は、元のURLの最後に留まる値のみが設定されます。product/addpost/editfoo/bar([a-zA-Z]+/[a-zA-Z]+)$2id

于 2013-02-02T10:59:06.227 に答える