Faça o processo de regras do mod_rewrite antes que o fcgi veja o pedido

1

Existe uma maneira de fazer com que as regras do mod_rewrite no meu arquivo .htaccess entrem em vigor antes que o PHP fique atrás do fcgi?

Eu tenho um link de validação de email que eu quero redirecionar da raiz para a página de login antes do PHP marcá-lo no banco de dados como confirmado.

Estas são as regras que eu tenho no meu .htaccess , e elas funcionam, mas o PHP vê a solicitação antes que a regra de reescrita tenha efeito.

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{QUERY_STRING} activation_key=
    RewriteRule ^$ /login [R,L]
    RewriteBase /
    RewriteRule ^index\.php$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]
</IfModule>

Quando o PHP vê um pedido que contém a string de consulta activation_key , ele marca o usuário como ativado. Se o usuário já estiver ativado, a página mostrará um erro "Link de validação desconhecido".

Com essas regras de reescrita, a solicitação redireciona para a página /login e exibe o erro, indicando - suponho - que o PHP já tenha visto a solicitação.

Esta é a configuração do mod_fastcgi:

<IfModule mod_fastcgi.c>
    DirectoryIndex index.html index.shtml index.cgi index.php
    AddHandler php5-fcgi .php
    Action php5-fcgi /php5-fcgi
    Alias /php5-fcgi /usr/lib/cgi-bin/php5-fcgi
    FastCgiExternalServer /usr/lib/cgi-bin/php5-fcgi -host 127.0.0.1:9000 -pass-header Authorization
</IfModule>
    
por joshperry 05.08.2013 / 20:45

1 resposta

0

Se eu estiver entendendo isso corretamente:

  1. Você faz uma solicitação para /?activation_key=foobar e o Apache envia de volta uma resposta para redirecioná-lo para /login .
  2. 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.

    
por 06.08.2013 / 00:23