Se eu estiver entendendo isso corretamente:
- Você faz uma solicitação para
/?activation_key=foobar
e o Apache envia de volta uma resposta para redirecioná-lo para/login
. - Você faz uma solicitação de acompanhamento para
/login
e essa página diz que já viu o link de validação. Mas não háactivation_key
nessa solicitação, ela só existia na primeira solicitação. Provavelmente já viu a string vazia antes e é por isso que está jogando um erro agora. (A lógica exata em seu script PHP pode não corresponder a essa explicação, mas suspeito que seja algo semelhante.)
Tente alterar suas regras de reescrita assim:
RewriteCond %{QUERY_STRING} activation_key=[^&]*
RewriteRule ^$ /login?activation_key=%1 [R,L]
Isso captura a chave de ativação e a transmite na próxima solicitação para /login
, para que o PHP tenha a chave.
Pode valer a pena, enquanto você está depurando para ecoar ou registrar em um arquivo a string de consulta ou a solicitação inteira ou até mesmo todo o $_SERVER
super global.
Sua última regra de reescrita tem um /
extra que não precisa estar lá. Esta seria uma regra melhor:
RewriteRule ^ index.php [L]
Os arquivos .htaccess
e a diretiva AllowOverride all
associada acarretam uma penalidade de desempenho com eles. Isso se torna dolorosamente óbvio ao usar strace
e assistir a todas as operações de arquivos procurando por todos os lugares que um arquivo .htaccess
poderia estar escondendo. Se você estiver executando seu próprio servidor Apache em vez de estar em hospedagem compartilhada, é melhor colocar essas regras na configuração principal e definir AllowOverride
para none. Dentro de um bloco <Directory>
, eles funcionarão como estão. Em qualquer outro lugar, eles precisarão de uma barra extra.