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.