Esta sugestão que fiz em comentários parece fazer quase a coisa certa:
reqrep ^([^\ :]+)(\ ?/.+/material/)(.+)/(.+)(\ .+)$ %2f
Na verdade, coloquei no lado errado de
%2f
. Eu também fiz incorretamente o espaço no início do segundo grupo de captura opcional, que não quebra o regex mas não é tecnicamente correto.
Esta é a forma correta:
reqrep ^([^\ :]+)(\ /.+/material/)(.+)/(.+)(\ .+)$ %2f
Esse é o problema com reqrep
- você está ajustando a primeira linha da solicitação HTTP diretamente. Poderoso, mas tedioso.
Quebrando isso:
^
Sempre ancore seu padrão no início da linha.
([^\ :]+)
Este é o verbo HTTP ( GET
, POST
, etc.). Não deve conter espaços nem cólon. Este é o grupo de captura 1.
(\ /.+/material/)
O verbo deve ser seguido por um espaço, a barra inicial (barras não precisam de uma barra invertida em expressões regulares HAProxy), um ou mais caracteres, e / material / ... este é o grupo de captura 2.
(.+)
A primeira parte do que queremos dividir em /
é o grupo de captura 3 ... e, na verdade, seria mais corretamente escrito ([^/]+)
, embora a maioria das incompatibilidades em potencial sejam evitadas pelo espaço que exigimos no grupo 5, abaixo.
/
da barra que queremos eliminar
(.+)
A parte da URL após o /
ser o grupo de captura 4
(\ .+)
um espaço, seguido por 1 ou mais caracteres, que capturarão HTTP/1.x
no final da linha de solicitação como grupo de captura 5.
$
ancorado ao final da linha.
Em seguida, junte-os novamente.
%2f
O HAProxy 1.6 lida com isso de maneira mais elegante com o interpretador Lua integrado, bem como com um conversor chamado regsub()
(embora seja muito simples - apenas substituições, sem grupos de captura, mas é bom para dividir cadeias) e variáveis definidas onde você pode "esconder" pequenos nuggets de dados enquanto processa o pedido. Ele também permite que você use http-request set-path
e tenha uma path
para ler e gravar o caminho isoladamente do resto da URL e sem ajustar o buffer de solicitação HTTP diretamente com uma expressão regular. A maioria ou todas essas coisas não estão em 1.5.