2017-09-15 50 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; 
} 

似乎地圖在第一次重寫階段只被評估一次,從來沒有之後。