portando RewriteCond% {QUERY_STRING} do Apache2 para o nginx

1

Eu criei um espelho estático de um grande site baseado em PHP, usando as seguintes sub-rotinas de reconfiguração do Apache2 para obter a string de consulta no caminho do sistema de arquivos para servir os arquivos estáticos corretamente. O antigo URL dinâmico foo/?bar mapeia para o arquivo estático foo/index.html@bar , foo/image.php?bar mapeia para foo/image.php@bar - todos com / substituído por %2F onde quer que ocorra em bar (que é no máximo 5 vezes no original local). Para dar um exemplo, tenho URLs como example.com/foo/?bar=baz/quux , que preciso mapear para arquivos como foo/index.html@bar=baz%2Fquux .

# turn off php
php_admin_value engine off

# enable rewrites
RewriteEngine on

# rewrite .../?... to .../index.html@... with s|/|%2F|g

RewriteCond %{QUERY_STRING} ^([^/]+)$
RewriteRule ^(.*)/$ %{DOCUMENT_ROOT}/$1/index.html@%1 [L,T=text/html]

RewriteCond %{QUERY_STRING} ^([^/]+)/([^/]+)$
RewriteRule ^(.*)/$ %{DOCUMENT_ROOT}/$1/index.html@%1\%2F%2 [L,T=text/html]

RewriteCond %{QUERY_STRING} ^([^/]+)/([^/]+)/([^/]+)$
RewriteRule ^(.*)/$ %{DOCUMENT_ROOT}/$1/index.html@%1\%2F%2\%2F%3 [L,T=text/html]

RewriteCond %{QUERY_STRING} ^([^/]+)/([^/]+)/([^/]+)/([^/]+)$
RewriteRule ^(.*)/$ %{DOCUMENT_ROOT}/$1/index.html@%1\%2F%2\%2F%3\%2F%4 [L,T=text/html]

# rewrite .../image.php?... to .../image.php@... with s|/|%2F|g

RewriteCond %{QUERY_STRING} ^([^/]+)$
RewriteRule ^(.*)/image.php$ %{DOCUMENT_ROOT}/$1/image.php@%1 [L,T=image/jpeg]

RewriteCond %{QUERY_STRING} ^([^/]+)/([^/]+)$
RewriteRule ^(.*)/image.php$ %{DOCUMENT_ROOT}/$1/image.php@%1\%2F%2 [L,T=image/jpeg]

RewriteCond %{QUERY_STRING} ^([^/]+)/([^/]+)/([^/]+)$
RewriteRule ^(.*)/image.php$ %{DOCUMENT_ROOT}/$1/image.php@%1\%2F%2\%2F%3 [L,T=image/jpeg]

RewriteCond %{QUERY_STRING} ^([^/]+)/([^/]+)/([^/]+)/([^/]+)$
RewriteRule ^(.*)/image.php$ %{DOCUMENT_ROOT}/$1/image.php@%1\%2F%2\%2F%3\%2F%4 [L,T=image/jpeg]

RewriteCond %{QUERY_STRING} ^([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)$
RewriteRule ^(.*)/image.php$ %{DOCUMENT_ROOT}/$1/image.php@%1\%2F%2\%2F%3\%2F%4\%2F%5 [L,T=image/jpeg]

A configuração do Apache2 acima funciona bem, mas estamos migrando para o nginx, que estou tendo problemas para configurar para este caso de uso. Eu posso pensar em um par de soluções alternativas, o primeiro está usando uma enorme map directiva listando todos os urls no site (indesejável devido ao tamanho), o segundo está escrevendo um pequeno script cgi personalizado (indesejável como este se destina a ser um espelho estático).

Is there an elegant solution?

(Renomear todos os arquivos no sistema de arquivos é uma opção, se isso facilitar as coisas, embora eu não veja como, mas mudar as URLs voltadas para o navegador não é possível.)

    
por Claude 11.04.2016 / 03:29

1 resposta

0

Não é algo como isto vai funcionar para os primeiros 4? Você precisa colocá-los na ordem inversa para que o local mais global não corresponda ao restante antes que ele alcance os alvos.

location ~ ^/(?<path>.+)/(?<path2>.+)/(?<path3>.+)/(?<path4>.+)/.*$ {
    rewrite ^/(.*)/$ /$path/index.html@$query_string%2F$path%2F$path2%2F$path3%2F$path4 break;
}

location ~ ^/(?<path>.+)/(?<path2>.+)/(?<path3>.+)/.*$ {
    rewrite ^/(.*)/$ /$path/index.html@$query_string\%2F$path\%2F$path2\%2F$path3 break;
}

location ~ ^/(?<path>.+)/(?<path2>.+)/.*$ {
    rewrite ^/(.*)/$ /$path/index.html@$query_string\%2F$path\%2F$path2 break;
}

location ~ ^/(?<path>.+)/.*$ {
    rewrite ^/(.*)/$ /$path/index.html@$query_string\%2F$path break;
}

Eu tentei com um diretório chamado foo, no qual eu coloquei arquivos chamados

  • index.html@bar%2Ffoo

  • index.html@bar%2Ffoo%2Ffoo2

quando eu acesso link eu recebo o arquivo index.html@bar%2Ffoo, quando eu acesso link eu recebo o arquivo index.html@bar%2Ffoo%2Ffoo2.

Eu deixo você se adaptar para image.php

    
por 20.04.2016 / 16:32

Tags