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, goto, 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:
Ao compilar a partir do código-fonte, o módulo é
compilado por padrão; ele pode ser desabilitado com a opção de
compilação --without-http_rewrite_module.
Em pacotes e imagens de nossos repositórios, o
módulo está incluído na compilação. Interrompe o processamento do conjunto atual de diretivas do módulo http_rewrite. Se uma diretiva for especificada dentro de um location, o processamento adicional da requisição continua nesse location. Exemplo: Adicionado na versão 1.12.0. Interrompe o processamento do conjunto atual de diretivas do módulo
O redirecionamento para uma location nomeada conta para o mesmo limite de 10
alterações de URI aplicado ao reescrever a URI de uma
requisição. Por exemplo, requisições sem um cookie 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. Aviso Embora diretivas de outros módulos possam ser usadas dentro do bloco if,
isso não é recomendado,
pois pode levar a comportamento inesperado. 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 "~" (para correspondência sensível a maiúsculas/minúsculas) e "~*" (para correspondência não sensível a maiúsculas/minúsculas). Expressões regulares podem conter capturas que ficam disponíveis para reutilização posterior nas 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: Nota O valor da variável interna $invalid_referer é definido pela diretiva valid_referers. Interrompe o processamento e retorna o É 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 de redirecionamento é 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 Veja também a diretiva error_page. Se a expressão regular especificada corresponder ao URI da requisição, o URI é alterado conforme especificado na string de A string de O parâmetro opcional interrompe o processamento do conjunto atual de diretivas do módulo http_rewrite e inicia a busca de um novo location correspondente ao URI alterado; interrompe o processamento do conjunto atual de diretivas do módulo 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: Mas se essas diretivas forem colocadas dentro do location "/download/", a flag Se uma string de Se uma expressão regular incluir os caracteres "}" ou ";", toda a expressão deve ser colocada entre aspas simples ou duplas. Habilita ou desabilita o registro dos resultados do processamento das diretivas do módulo http_rewrite no error_log no nível notice. Define um valor para a variável especificada. O valor pode conter texto, variáveis e suas combinações. Padrão http, server, location, if Controla se avisos sobre variáveis não inicializadas são registrados. 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 serão traduzidas nestas instruções: Note que não há instruções para a diretiva limit_rate, pois ela não está relacionada 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 pode ser reduzida em uma instrução se a primeira barra for movida para dentro dos parênteses na expressão regular: As instruções correspondentes então ficarão assim:Diretivas#
break#
if ($slow) {
limit_rate 10k;
break;
}
goto#
http_rewrite e realiza um redirecionamento interno incondicional para a
location nomeada indicada pelo parâmetro
name. Ao contrário de rewrite, não altera $uri. O
parâmetro deve ser um nome precedido por @; caso contrário, a
configuração é rejeitada.session podem ser roteadas para
um backend de autenticação dedicado:if ($cookie_session = "") {
goto @auth_backend;
}
location / {
proxy_pass http://backend;
}
location @auth_backend {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
}
if#
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;
}
return#
código especificado para o cliente. O código não padronizado 444 fecha a conexão sem enviar cabeçalho de resposta.http://, https:// ou a string "$scheme". A URL pode conter variáveis.rewrite#
substituição. As diretivas rewrite são executadas sequencialmente na ordem em que aparecem no arquivo de configuração. É possível interromper o processamento adicional das diretivas usando flags. Se uma string de substituição começar com http://, https:// ou "$scheme", o processamento para e o redirecionamento é retornado ao cliente.substituição pode conter variáveis, incluindo as capturas posicionais $1 a $9.flag pode ser um dos seguintes:lastbreakredirectsubstituição não começar com http://, https:// ou "$scheme";permanentserver {
# ...
rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 last;
rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra last;
return 403;
# ...
}
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;
}
substituição incluir novos argumentos de requisição, os argumentos anteriores da requisição 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;
rewrite_log#
set#
uninitialized_variable_warn#
uninitialized_variable_warn on | off;uninitialized_variable_warn on;Implementação interna#
location /download/ {
if ($forbidden) {
return 403;
}
if ($slow) {
limit_rate 10k;
}
rewrite ^/(download/.*)/media/(.*)\..*$ /$1/mp3/$2.mp3 break;
}
variable $forbidden
check for zero
return 403
end of code
variable $slow
check for zero
match of regular expression
copy "/"
copy $1
copy "/mp3/"
copy $2
copy ".mp3"
end of regular expression
end of code
rewrite ^/(download/.*)/media/(.*)\..*$ /$1/mp3/$2.mp3 break;
rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 break;
match of regular expression
copy $1
copy "/mp3/"
copy $2
copy ".mp3"
end of regular expression
end of code