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 .html, parece que o equivalente funcional de:

while(substr($address,-4)!='html') $address.='html'

Obviamente, eu estou faltando alguma coisa.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top