“A solicitação excedeu o limite de 10 redirecionamentos internos” com a regra de reescrita simples

1

Estou tentando escrever uma regra de reescrita simples que será alterada:

https://example.com/index.php?shortened_url=value

para

https://example.com/value

Para conseguir isso, estou usando a seguinte regra de reescrita:

RewriteEngine On
RewriteRule ^([^/]*)$ /index.php?shortened_url=$1 [L]

Mas recebo o erro:

Request exceeded the limit of 10 internal redirects due to probable configuration error.

Claramente, isso sugere que há um problema de looping em algum lugar, mas, até onde eu sei, a minha regra é bastante direta e não deve causar nenhum loop?

    
por Syn 04.10.2017 / 14:58

2 respostas

1

Primeiro de tudo você perdeu os argumentos para o comando RewriteRule, a ordem é

RewriteRule WHAT WHERE [OPTIONS] (atalho para simplificar as coisas - consulte a documentação)

Há mais sobre RewriteRule aqui link

E o que sua regra realmente faz é reescrever qualquer número de barras / para o /index.php?shortened_url=$1 , se não me engano.

Portanto, o seu https://example.com/ é redirecionado para o URL longo, bem como https://example.com/////////

Você precisa atualizar suas habilidades de regexp - tente este link para ajudá-lo link

E, finalmente, a regra que você está procurando deve ser algo como:

RewriteRule ^/index.php\?shortened_url=(.*)$ https://example.com/$1 [L]

    
por 04.10.2017 / 15:10
1
RewriteRule ^([^/]*)$ /index.php?shortened_url=$1 [L]

Isso resultará em um loop de reescrita porque /index.php?shortened_url=value será reescrito novamente em /index.php?shortened_url=index.php (de novo e de novo).

Uma maneira de evitar esse loop de regravação é apenas reescrever quando não houver uma string de consulta (desde que você não esteja usando a string de consulta para outros propósitos neste URL). Por exemplo:

RewriteCond %{QUERY_STRING) ^$
RewriteRule ^([^/]*)$ /index.php?shortened_url=$1 [L]

Ou exclua pontos do padrão RewriteRule . Por exemplo:

RewriteRule ^([^/.]*)$ /index.php?shortened_url=$1 [L]

O importante a observar aqui é que o sinalizador L ( last ) não interrompe todo o processamento quando usado em arquivos .htaccess por diretório. Ele simplesmente interrompe a atual rodada de processamento. O processo de reescrita começa efetivamente de novo até que a URL passe inalterada. Você precisa impedir que o URL reescrito seja reescrito novamente.

that will change:

https://example.com/index.php?shortened_url=value

to

https://example.com/value

bocian85 certamente tem um ponto a respeito de sua descrição, já que seu código está fazendo o oposto. Seu código reescreve https://example.com/value to https://example.com/index.php?shortened_url=value . (Presumivelmente, você já alterou os URLs em seu aplicativo para estar no formato https://example.com/value ?)

No entanto, parece que o código está fazendo a coisa certa, então acho que é apenas sua descrição que está de volta à frente. (?) (Curioso ... as pessoas geralmente descrevem isso como você fez - na ordem inversa - como se eles estivessem descrevendo o resultado líquido no aplicativo, e não o que a diretiva realmente faz).

    
por 04.10.2017 / 15:31