Variável para o sufixo $ request_uri que não corresponde ao prefixo do bloco de localização

4

Suponha que eu queira mover um diretório /images/ para um host images para que o que estava antes de http://example.org/images/foo.png se tornasse http://images.example.org/foo.png .

Se eu fizer isso: location /images/ { return 301 http://images.example.org$request_uri; } , o resultado é um redirecionamento para http://images.example.org/images/foo.png , que não é o que eu quero.

Uma pergunta antiga tem um resposta que sugere o uso de um regexp location , mas isso parece um exagero.

Existe realmente nenhuma maneira de se referir a $request_uri com o prefixo location cortado sem usar expressões regulares? Parece um recurso óbvio para se ter.

    
por hsivonen 20.10.2013 / 12:40

2 respostas

1

Eu não acho que poderíamos eliminar completamente o regex para esse caso de uso. No entanto, aqui está uma solução alternativa que não usa regex location , mas usa regex dentro de location block ...

location /images/ {
  rewrite "^/images/?(.*)$" "/$1";
  return 301 http://images.example.org$uri;
}

Por favor, saiba que $uri não contém $args . No entanto, $request_uri faz. Nesta solução alternativa, modificamos o $uri , usando um regex, antes de ser processado. $request_uri não pode ser modificado, no entanto.

    
por 20.10.2013 / 14:11
1

Para adicionar Resposta do Poth , você pode simplesmente adicionar o permanent flag a rewrite e redirecionar diretamente sem usando return :

location /images/ {
  rewrite ^/images/(.*)$ $scheme://images.example.org/$1 permanent;
}

Isso também manterá os parâmetros com o redirecionamento.

Ou, como alternativa, se for necessário modificar mais o uri, basta anexar $is_args e $args por trás de $uri :

location /images/ {
  rewrite ^/images/(.*)$ /$1;
  [ ... more rewriting ... ]
  return 301 $scheme://images.example.org$uri$is_args$args
}
    
por 08.02.2014 / 18:22

Tags