2017-09-15 51 views
0

使用以下nginx配置请求/olddir1/img.jpeg将执行正确的内部重定向到/newdir1/img.jpeg,但它会将变量$extra_uri设置为它在第一个重写周期期间的值,即/olddir1/img.jpeg

只是执行rewrite指令之前,$alias_uri$extra_uri将具有以下值,正确的:

  • $alias_uri/newdir1/img.jpeg
  • $extra_uri/olddir1/img.jpegrewrite指令运行

后,将$ uri设置为/newdir1/img.jpeg,变量将具有以下内容值:

  • $alias_uri/newdir1/img.jpeg
  • $extra_uri/olddir1/img.jpeg

$alias_uri具有正确的值(没有在map已匹配的,所以正在使用的默认值,即当前的$uri)。 $extra_uri反而有陈旧的价值。

为什么$extra_uri没有设置为新的$uri

server { 
    listen 80 default_server; 

    server_name  'test.example.local'; 

    location/{ 
     root '/var/www/test/content'; 

     set $alias_uri $example__alias_uri; 
     set $extra_uri $example__extra_uri; 

     if ($alias_uri != $uri) { 
      rewrite^$alias_uri last; 
     } 

     add_header X-Alias "uri: >$uri<alias_uri:>$alias_uri<" always; 
     add_header X-Extra "uri: >$uri<extra_uri:>$extra_uri<" always; 

     try_files $uri =404; 
} 

map $uri $example__alias_uri { 
    default $uri; 

    ~/olddir1(?<file>/[^/]*)$ /newdir1$file; 
    ~/olddir2(?<file>/[^/]*)$ /newdir2$file; 
} 

map $uri $example__extra_uri { 
    default $uri; 
} 

回答

0

标记的地图为volatile使这个问题消失。

map $uri $example__alias_uri { 
    volatile; 
    default $uri; 

    ~/olddir1(?<file>/[^/]*)$ /newdir1$file; 
    ~/olddir2(?<file>/[^/]*)$ /newdir2$file; 
} 

map $uri $example__extra_uri { 
    volatile; 
    default $uri; 
} 

似乎地图在第一次重写阶段只被评估一次,从来没有之后。