Como posso encontrar, enquanto a regra de reescrita neste arquivo htaccess, causa um erro interno do servidor?


0

Eu tenho um arquivo htaccess que começa como:

RewriteEngine On
RewriteBase /

RewriteCond %{QUERY_STRING}  where-can-i-find-information-about-homer-training
RewriteRule ^(.*)$  http://usersupport.homerenergy.com/customer/en/portal/articles/2186858-where-can-i-find-information-about-homer-training-?  [R=301,L]

RewriteCond %{QUERY_STRING}  is-homer-pro-conservative-in-its-predictions
RewriteRule ^(.*)$  http://usersupport.homerenergy.com/customer/en/portal/articles/2186859-is-homer-pro-conservative-in-its-predictions-?  [R=301,L]
...

o que se aplica a 308 regras mais semelhantes. Como você pode ver, isso visa redirecionar uma lista de artigos de um site para outro, onde o elemento correspondente é o nome do artigo na parte da consulta da string GET.

Se eu apenas colocar um ou dois dos pares de RewriteCond/ RewriteRules no arquivo, isso funcionará. Mas quando uso o arquivo inteiro, recebo um erro interno de 500 servidores.

Evidentemente, uma das regras está causando o erro, mas a varredura do arquivo não pode ver qual é.

Observando o log de erros, vejo uma mensagem como esta:

/var/www/html/.htaccess: RewriteCond: bad argument line '%{QUERY_STRING}'

o que não me diz muito.

Como posso saber qual regra está causando esse erro?


Meu palpite é que você está perdendo o condPattern (segundo argumento) na RewriteConddiretiva problemática . Qual versão do Apache você está executando? Dependendo da versão, você pode (temporariamente) habilitar o log mais detalhado (erro), o que ajudará a identificar exatamente onde o erro está ocorrendo.
MrWhite

Você pode usar 'LogLevel debug rewrite: trace8' para obter mais informações de log
Froggiz

Respostas:


1

Eu acredito que você precisa colocar seus valores de teste da seguinte forma:

https://httpd.apache.org/docs/trunk/rewrite/remapping.html (seção: Reescreva a sequência de consultas)

RewriteCond "%{QUERY_STRING}"  "where-can-i-find-information-about-homer-training"
RewriteRule "^(.*)$"  "http://usersupport.homerenergy.com/customer/en/portal/articles/2186858-where-can-i-find-information-about-homer-training-?" [R=301,L]

Você pode ter um espaço em um dos seus valores, eu acho. Tente começar, pode corrigi-lo. Geralmente não uso "para reescrever, mas geralmente não uso espaços, bem, quero dizer, nunca uso espaços nesses tipos de nomes.

Apenas como um aparte,

^(.*)$ 

realmente não tem sentido, porque

(.*)

já significa: tudo isso. Então, começar e terminar tudo é um pouco redundante, acredito.

Um possível erro alternativo é que você simplesmente perdeu uma quebra de linha na série 500, pode verificar isso usando a visualização do número da linha no seu editor de código.


Obrigado, @Lizardx, que me colocou no caminho certo. Usando esse excelente recurso, htaccesscheck.com/index.html , consegui depurar o restante dos erros. Constatou que ter aspas ao redor de seqüências de caracteres no RewriteRule causa um erro de 'delimitadores de sinalizadores inválidos'.
Rixter 31/10/16

Eu estava pensando sobre aqueles "em torno de strings também, eu nunca os usei, fiquei realmente surpreso ao vê-los nos documentos de reescrita do apache. Você pode postar um exemplo da string exata que inverteu o erro? Estou curioso. Um exemplo que mostra a linha que dispara o erro em relação à linha corrigida
#

Fiquei curioso sobre o recurso de verificação do htaccess e coloquei um arquivo .htaccess muito complicado para garantir que ele não esteja emitindo mensagens de erro falsas e tudo verificado, para que pareça um bom recurso que possa realmente funcionar. A sintaxe do apache htaccess / config sempre foi muito difícil de dominar. Passei anos originalmente tentando entender como corrigir essas 500 mensagens de erro que, como ajuda na depuração, não são muito úteis, lol.
Lizardx # 31/16
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.