RewriteEngine em .htaccess para arquivos de captura não terminando em html
-
03-07-2019 - |
Pergunta
Eu gostaria de usar mod reescrever para Endereços de páginas web converter como / diretório para /directory/index.html , em uma situação de hospedagem LAMP padrão. O que eu tenho obras para endereços que terminam em uma barra. Não consigo encontrar uma maneira de lidar com endereços que não terminam uma barra .
O que parece que ele deve funcionar é:
rewriterule ^(.*)/$ $1/index.html [L] /* addresses ending in / */
rewriterule ^(.*(?!html))$ $1/index.html [L] /* where the problem is */
Mas a segunda linha faz com que um erro de 500 servidor. Se eu adicionar uma única letra x para a segunda linha:
rewriterule ^(.*)/$ $1/index.html [L]
rewriterule ^(.*x(?!html))$ $1/index.html [L]
Ele começa a trabalhar, mas apenas para nomes de diretório que terminam em um x . Eu tentei substituir o x com muitas coisas diferentes. Qualquer coisa mais complicada do que personagens reais (como [^ x] ou. +) Dá um erro de 500 servidor.
E, para satisfazer minha própria curiosidade, alguém sabe por que a adição de uma única letra verdadeira faz a diferença entre um erro no servidor e uma regra perfeitamente funcionando?
[aceitado Resposta] Graças ao Gumbo eu era capaz de aproximar uma solução usando rewritecond:
rewritecond %{REQUEST_URI} !\.[^/]+$ rewriterule (.+) $1/index.html [L]
Isso funciona, mas filtros mais do que apenas .html - poderia bloquear outras páginas. Infelizmente,
rewritecond %{REQUEST_URI} !\.html$
resulta em um erro de servidor:
Pedido excedeu o limite de 10 redirecionamentos internos devido a um erro de configuração provável. Use 'LimitInternalRecursion' para aumentar o limite, se necessário.
eu ainda gostaria de saber por que:
rewriterule ^(.*(?!html))$ $1/index.html [L]
resultados em um loop. A primeira metade é suposto para verificar se ele não fim em .html. Desde a segunda metade acrescenta ??em> .html, parece que o equivalente funcional de:
while(substr($address,-4)!='html') $address.='html'
Obviamente, eu estou faltando alguma coisa.
Solução
Use uma directiva RewriteCond
para verificar se o caminho URL não termina com um .html
:
RewriteCond %{REQUEST_URI} !\.html$
RewriteRule ^(.*[^/])?/?$ $1/index.html [L]
Editar Você está usando uma afirmação look-ahead ((?!…)
). Mas não há nada depois .*
(apenas uma $
). Então, tente um olhar-behind afirmação em vez disso:
RewriteRule ^.*$(?<!html) $0/index.html [L]
Mas note que você provavelmente precisará Apache 2.2 para usar essas afirmações.
Outras dicas
Bem, para realmente fazê-lo funcionar, você pode simplesmente usar um negativo lookbehind em vez de uma visão antecipada:
RewriteRule ^(.*)(?<!html)$ $1/index.html [L]
Eu não tenho certeza de improviso por adicionar o 'x' faz com que funcione, eu vou editar se eu descobrir isso.
Por isso adicionando a x
faz com que funcione:
Se a substituição irá coincidir com a regex, o RewriteRule será aplicado novamente. Como exemplo, isso faz com que um erro:
RewriteRule ^(.*)$ $1.rb
porque iria substituir script
com script.rb
. Que coincide com o regex, por isso substitui script.rb
com script.rb.rb
, uma e outra vez ...
Esta é sugerida no log de erro:
Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary.
No seu exemplo, você adicionar index.html até o fim. Quando há uma x
no final da regex, então ele não irá corresponder a sua substituição, que termina em uma l
.