2012-03-29 18 views
3

私はnginxのマップを使用しようとしていますが、結果は期待した通りではありません。Nginxマップは私の正規表現の引数を使用していません

これは私が持っているものです。

map $uri $new { 
    default         ""; 
    ~*/cc/(?P<suffix>.*)$     test.php?suffix=$suffix; 
} 

location ~  [a-zA-Z0-9/_]+$ { 
     proxy_pass http://www.domain.com:81/$new; 
     proxy_set_header X-Real-IP $remote_addr; 
     proxy_set_header Host $host; 
     proxy_set_header X-Host $host; 
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
} 

私はwww.domain.com/cc/abcに行くとき、私は

2012/03/29 17:27:53 [warn] 3382#0: *33 an upstream response is buffered to a temporary file /var/cache/nginx/proxy_temp/5/00/0000000005 while reading upstream, client: 1.2.3.4, server: www.domain.com, request: "GET /cc/abc HTTP/1.1", upstream: "http://1270.0.0.1:81/test.php?suffix=$suffix", host: "www.domain.com" 

ログで確認$サフィックスではありません置き換えられました。私はこれを行うとき

は、しかし:だから

2012/03/29 17:29:39 [warn] 5916#0: *26 an upstream response is buffered to a temporary file /var/cache/nginx/proxy_temp/2/00/0000000002 while reading upstream, client: 1.2.3.4, server: www.domain.com, request: "GET /cc/abc HTTP/1.1", upstream: "http://1270.0.01:81/abc", host: "www.domain.com" 

map $uri $new { 
    default         ""; 
    ~*/cc/(?P<suffix>.*)$     $suffix; 
} 

location ~  [a-zA-Z0-9/_]+$ { 
     proxy_pass http://www.domain.com:81/$new; 
     proxy_set_header X-Real-IP $remote_addr; 
     proxy_set_header Host $host; 
     proxy_set_header X-Host $host; 
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
} 

そして今の私がwww.domain.com/cc/abcに行くために行くときに、ログが私にこのショー書き換えに変数を含む文字列が含まれている場合、置換されません。しかし、それが変数だけを含んでいれば、それはうまくいくでしょう。

私は間違っていますか?

答えて

8

あなたが発見したように、マップ置換は静的な文字列または単一の変数にしかなりません。 test.php?suffix = $ suffixは$で始まらないので、nginxは静的な文字列であるとみなします。代わりに、マップを使用しての、あなたが望むものを達成するために、2回の書き換えを使用する必要があります:

location ~ [a-zA-Z0-9/_]+$ { 
    rewrite ^/cc/(.*) /test.php?suffix=$1 break; 
    rewrite ^/break; 

    proxy_pass http://www.domain.com:81; 
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_set_header Host $host; 
    proxy_set_header X-Host $host; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
} 

最初の書き換えがURLから任意の初期/ CC /を取り除くと、あなたのようなURLの引数として残りの部分を追加します地図はしようとしていた。 breakフラグは、nginxに書き換え指示文の処理を停止するよう指示します。最初のリライトが一致しない場合、2番目のリライトは常に一致し、/にURLを設定します。

EDIT:オリジナルの設定が

+0

をうまくいくように、1.11.0のとおり、マップの値は、複素数値であることができうーん、それは残念だ:(思想、彼らははるかに高速に書き換えた後ですので、私は、マップを使用することができ I。明日書き直しをするつもりですが、それが動作すれば教えてくれるでしょう。 –

+0

Btw、なぜドキュメントにはそれが可能な例がありますか?http://wiki.nginx.org/HttpMapModule だからこそ マップを使用してサーバーセクションの値を書き換えても、それは可能ですか? –

+0

wikiが間違っています。その例を削除します。ありがとう – kolbyjack

関連する問題