Para espelhar um site inteiro como HTML estático,
Eu gostaria de converter URLs como http://example.com/script.php?t=12
para http://example.com/script.php_t=12
.
O aviso ?
no URL está sendo convertido para _
.
Isso permitirá que o nginx ou o apache sirva esses arquivos do disco como o HTML bruto que obtivemos e salvamos wget
- um arquivo para cada URL - e não como um arquivo PHP.
É possível fazer isso através da reescrita de URL do Nginx?
http://example.com/script.php?a=1&t=3
vai precisar de alguma ação super chique reescritat
comof
,u
, etc.Respostas:
Eu tenho esse trabalho usando try_files:
Isso tentará encontrar um arquivo no disco com o nome do padrão que você forneceu com "_" em vez de "?".
A configuração adicional depende de como você salvou arquivos estáticos, como imagens ou folhas de estilo. Você pode adicionar um fallback tentando lê-los sem consultar o disco do formulário da cadeia de caracteres da seguinte maneira:
fonte
location ~ \.php$
nós podemos começartry_files
a trabalhar, mas ele não funciona emlocation /
Algo ao longo das linhas:
fonte
?
minha resposta usada..*
cláusula mais estrita no primeiro parâmetro de reescrita. Isso é extremamente útil!Eu não acho que você será capaz de fazer isso com o vanilla nginx, mas se estiver disposto a instalar o módulo Lua para o nginx ( http://wiki.nginx.org/HttpLuaModule ), você poderá fazê-lo.
Testado localmente e parece fazer o que você está procurando. Se você deseja manter outros parâmetros separados por e comercial, altere o bloco rewrite_by_lua para
fonte
Isso funciona no nginx / 1.6.2.
Mas, pessoalmente, eu usaria a
try_files
solução com um fallback para um URI original, se houver .Por exemplo, se você tiver um
script.php
disco, ele tentará primeiro, e depois, se não houver nenhum, será utilizadoscript.php_t=12
.try_files
precisa de uma versão recente o suficiente do nginx.E se isso não for suficiente, você pode fazer isso dentro de um
if
:fonte
?
para o final de sua reescrita lá assim que os parâmetros de consulta não são adicionados a ele ..)try_files
vai parar$uri
se houver um bloco de localização correspondente a esse arquivo ou um arquivo para ele (a solicitação sem obter argumentos) - é esse o caso??
não tem efeito visível em arquivos estáticos, você só vê uma consulta extra nos seus logs de acesso; Se você se preocupa com ele, com certeza adicionar um ponto de interrogaçãoO wiki diz
Então,
rewrite ^ ${uri}_$args? last;
deve funcionar.fonte
rewrite ^ $uri_$args? last;
As respostas sugeridas acima devem funcionar. No entanto, você vê a sensibilidade do seu URL. Como o nginx tenta verificar se o nome do arquivo existe no servidor primeiro, qualquer parâmetro extra o desativará.
Minha sugestão é deixar o URL como está e encaminhá-lo para o arquivo correto com php. Você tem acesso ao
t
parâmetrofonte