Por que as condições do Apache Rewrite não estão funcionando?

1

Eu tentei executar um redirecionamento escrevendo no arquivo .htaccess:

RewriteEngine on
RewriteRule article-1 www.another-site.com/article-1 [R=301,L,NC]

e funciona corretamente. De qualquer forma, quando eu adiciono uma condição de reescrita, por exemplo:

RewriteEngine on
RewriteCond %{HTTP_REFERER} domain.tracker.com [NC]
RewriteRule article-1 www.another-site.com/article-1 [R=301,L,NC]

o redirecionamento não é mais executado como se a condição fosse sempre avaliada como falsa. O referenciador é avaliado corretamente (tentei redirecionar para www.site.com?ref=%{HTTP_REFERER} e obtive www.site.com?ref= link , que é o referenciador correto).

A única outra instrução de reescrita que eu tenho no arquivo .htaccess é

#BEGIN WORDPRESS    
<IfModule mod_rewrite.c>
    RewriteRule ^index\.php$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]
    </IfModule>
#END WORDPRESS

Por que as condições não estão funcionando? Poderia ser um conflito com a instrução do WordPress? Poderia depender do provedor de hospedagem?

    
por Arthu83 19.09.2018 / 23:23

1 resposta

0

The WordPress directives are at the bottom of the .htaccess file, while I've put mine at the top.

Isso está correto.

RewriteCond %{HTTP_REFERER} domain.tracker.com [NC]

Não há nada de errado com a diretiva RewriteCond que você postou que impediria que isso funcionasse. A condição é bem-sucedida se o cabeçalho Referer do HTTP contiver a string "domain.tracker.com" (não diferencia maiúsculas de minúsculas). É isso aí, não há mais nada para isso. Tenha em mente que o CondPattern é um regex, então os pontos ( . ) precisam ter escape de barra invertida para corresponder a pontos literais, caso contrário eles correspondem a qualquer caractere (que é o caso no seu exemplo). Então, sua diretiva está potencialmente combinando muito, mas isso não vai impedir que ela funcione. por exemplo. Também corresponderia a um referenciador HTTP do formulário: http://example.com/domain-tracker-com/foo .

A causa mais comum de tal condição não funcionar é quando o HTTP_REFERER não contém o que você espera. Como você está, sem dúvida, ciente, o cabeçalho Referer é notoriamente não confiável: ele pode ser bloqueado pelo cliente e / ou site e é facilmente falsificado . Embora seu teste apareça para mostrar o Referer sendo passado como esperado, então isso é um mistério.

RewriteRule article-1 www.another-site.com/article-1 [R=301,L,NC]

NO ENTANTO, a RewriteRule substituição (ou seja, www.another-site.com/article-1 ) é inválida neste contexto e não resultará no redirecionamento como indicado, isto é. para o host externo www.another-site.com . Você está perdendo o esquema necessário (por exemplo, http ) e deve estar no formato: http://www.another-site.com/article-1 . Em outras palavras, uma URL absoluta .

(Gostaria de saber se isso era simplesmente um erro de digitação na sua pergunta, pois você usou um URL absoluto em uma pergunta relacionada no SO , mas você parece ter confirmado nos comentários que está correto como está escrito.

Quando a RewriteRule substituição não começa com um esquema ( http ou https ) ou barra ( / ) então é vista como um relativo caminho da URL. Em por diretório .htaccess arquivos, isso significa que ele é visto como relativo ao diretório do sistema de arquivos que contém o arquivo .htaccess , que é chamado de "diretório-prefixo" (a menos que uma diretiva RewriteBase indique o contrário ou as diretivas estão sendo "herdadas"). Este prefixo de diretório é adicionado de volta à substituição no final do processo de reescrita. No caso do RewriteRule acima, isso provavelmente resultaria em um redirecionamento totalmente inválido do formulário:

http://example.com/home/user/public_html/www.another-site.com/article-1

Onde /home/user/public_html/ é o prefixo de diretório, isto é. o caminho absoluto do sistema de arquivos do local do arquivo .htaccess . example.com é o host atual (provavelmente o Host que foi solicitado). www.another-site.com/article-1 é o caminho de URL relativo, conforme indicado na substituição RewriteRule .

Como dito acima, você precisa incluir o esquema / protocolo para formar uma URL absoluta:

RewriteCond %{HTTP_REFERER} domain\.tracker\.com [NC]
RewriteRule article-1 http://www.another-site.com/article-1 [R=301,L,NC]

Observe também que o regex article-1 corresponde à string "article-1" em qualquer lugar dentro do URL solicitado. por exemplo. /foo-article-1-bar/ também corresponderia. Se você estiver correspondendo a um URL específico, deverá corresponder a esse URL específico, por exemplo. %código%. Se o caminho da URL no site de destino for o mesmo, você poderá evitar a repetição capturando o caminho da URL e usando uma referência anterior na ^article-1$ substituição . Por exemplo:

RewriteRule ^(article-1)$ http://www.another-site.com/$1 [R=301,L,NC]

Why are the conditions not working?

A partir das informações fornecidas, não há explicação razoável.

Could it be a conflict with WordPress instruction?

Colocando estas diretivas antes do controlador frontal do WordPress, você praticamente eliminou essa possibilidade.

Could it depend by the hosting provider?

Isso é muito improvável.

Tente isso com uma string de consulta simples:

RewriteCond %{QUERY_STRING} ^bar=1$
RewriteRule ^(foo)$ http://example.com/$1 [R,QSD,L]

Solicitação:

/foo?bar=1

E você deve estar temporariamente (302) redirecionado para:

http://example.com/foo

ie. o mesmo caminho de URL, mas com a string de consulta removida.

    
por 24.09.2018 / 00:28