Rewrite#
O módulo é usado para alterar o URI da requisição usando expressões regulares PCRE, retornar redirecionamentos e selecionar configurações condicionalmente.
As diretivas break, if, return, rewrite e set são processadas na seguinte ordem:
as diretivas deste módulo especificadas no nível server são executadas sequencialmente;
repetidamente:
Diretivas#
break#
Interrompe o processamento do conjunto atual de diretivas http_rewrite.
Se uma diretiva for especificada dentro de um location, o processamento adicional da requisição continua nesse location.
Exemplo:
if ($slow) {
limit_rate 10k;
break;
}
if#
A condição especificada é avaliada. Se verdadeira, as diretivas deste módulo especificadas entre chaves são executadas, e a requisição recebe a configuração dentro da diretiva if. Configurações dentro das diretivas if são herdadas do nível de configuração anterior.
Uma condição pode ser qualquer uma das seguintes:
nome de variável; falso se o valor da variável for uma string vazia ou "0";
comparação de variável com string usando os operadores "=" e "!=";
correspondência de variável com expressão regular usando os operadores "~" (sensível a maiúsculas/minúsculas) e "~*" (não sensível). Expressões regulares podem conter capturas que ficam disponíveis depois como variáveis $1..$9. Também estão disponíveis os operadores negativos "!~" e "!~*". Se a expressão regular incluir os caracteres "}" ou ";", toda a expressão deve ser colocada entre aspas simples ou duplas.
verificação de existência de arquivo com os operadores "-f" e "!-f";
verificação de existência de diretório com os operadores "-d" e "!-d";
verificação de existência de arquivo, diretório ou link simbólico com os operadores "-e" e "!-e";
verificação de arquivo executável com os operadores "-x" e "!-x".
Exemplos:
if ($http_user_agent ~ MSIE) {
rewrite ^(.*)$ /msie/$1 break;
}
if ($http_cookie ~* "id=([^;]+)(?:;|$)") {
set $id $1;
}
if ($request_method = POST) {
return 405;
}
if ($slow) {
limit_rate 10k;
}
if ($invalid_referer) {
return 403;
}
Nota
O valor da variável interna $invalid_referer é definido pela diretiva valid_referers.
return#
Interrompe o processamento e retorna o código
especificado para o cliente. O código não padronizado 444 fecha a conexão sem enviar cabeçalho de resposta.
É possível especificar uma URL de redirecionamento (para códigos 301, 302, 303, 307 e 308) ou o texto do corpo da resposta (para outros códigos). Texto de corpo de resposta e URLs de redirecionamento podem conter variáveis. Como caso especial, uma URL de redirecionamento pode ser especificada como um URI local para este servidor, nesse caso a URL completa é formada de acordo com o esquema da requisição ($scheme) e as diretivas server_name_in_redirect e port_in_redirect.
Além disso, uma URL para redirecionamento temporário com código 302 pode ser especificada como único parâmetro. Esse parâmetro deve começar com http://
, https://
ou "$scheme". A URL pode conter variáveis.
Veja também a diretiva error_page.
rewrite#
Se a expressão regular especificada corresponder ao URI da requisição, o URI é alterado conforme a string de substituição
. As diretivas rewrite são executadas em sequência na ordem em que aparecem no arquivo de configuração. É possível interromper o processamento adicional usando flags
. Se uma string de substituição
começar com http://
, https://
ou "$scheme", o processamento para e o redirecionamento é retornado ao cliente.
O parâmetro opcional flag
pode ser um dos seguintes:
| interrompe o processamento do conjunto atual de diretivas http_rewrite e inicia a busca de um novo location correspondente ao URI alterado; |
| interrompe o processamento do conjunto atual de diretivas http_rewrite como na diretiva break; |
| retorna um redirecionamento temporário com o código 302; usado se a string de |
| retorna um redirecionamento permanente com o código 301. |
A URL completa de redirecionamento é formada de acordo com o esquema da requisição ($scheme) e as diretivas server_name_in_redirect e port_in_redirect.
Exemplo:
server {
# ...
rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 last;
rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra last;
return 403;
# ...
}
Mas se essas diretivas forem colocadas dentro do location "/download/", a flag last
deve ser substituída por break
, caso contrário o Angie fará 10 ciclos e retornará erro 500:
location /download/ {
rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 break;
rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra break;
return 403;
}
Se uma string de substituição
incluir novos argumentos de requisição, os argumentos anteriores são adicionados após eles. Se isso não for desejado, colocar um ponto de interrogação no final da string de substituição evita que sejam adicionados, por exemplo:
rewrite ^/users/(.*)$ /show?user=$1? last;
Se uma expressão regular incluir os caracteres "}" ou ";", toda a expressão deve ser colocada entre aspas simples ou duplas.
rewrite_log#
Habilita ou desabilita o registro dos resultados do processamento das diretivas do módulo http_rewrite no error_log no nível notice.
set#
Define um valor para a variável especificada. O valor pode conter texto, variáveis e suas combinações.
uninitialized_variable_warn#
| |
Padrão |
|
http, server, location, if |
Controla se avisos sobre variáveis não inicializadas são registrados.
Implementação Interna#
As diretivas do módulo http_rewrite são compiladas na fase de configuração em instruções internas que são interpretadas durante o processamento da requisição. O interpretador é uma máquina de pilha virtual simples.
Por exemplo, as diretivas
location /download/ {
if ($forbidden) {
return 403;
}
if ($slow) {
limit_rate 10k;
}
rewrite ^/(download/.*)/media/(.*)\..*$ /$1/mp3/$2.mp3 break;
}
serão traduzidas nestas instruções:
variable $forbidden
check against zero
return 403
end of code
variable $slow
check against zero
match of regular expression
copy "/"
copy $1
copy "/mp3/"
copy $2
copy ".mp3"
end of regular expression
end of code
Note que não há instruções para a diretiva limit_rate acima, pois ela não pertence ao módulo http_rewrite. Uma configuração separada é criada para o bloco if. Se a condição for verdadeira, a requisição recebe essa configuração onde limit_rate é igual a 10k.
A diretiva
rewrite ^/(download/.*)/media/(.*)\..*$ /$1/mp3/$2.mp3 break;
pode ser reduzida em uma instrução se a primeira barra da expressão regular for colocada dentro dos parênteses:
rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 break;
As instruções correspondentes então ficarão assim:
match of regular expression
copy $1
copy "/mp3/"
copy $2
copy ".mp3"
end of regular expression
end of code