在fcgi看到请求之前使mod_rewrite规则进行处理

有没有办法让我的.htaccess文件中的mod_rewrite规则在fcgi后面的PHP看到请求之前生效?

我有一个电子邮件validation链接,我想从根目录redirect到login页面,然后PHP在数据库中将其标记为已确认。

这些是我在.htaccess中的规则,它们工作,但PHP在重写规则生效之前看到请求。

 <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> 

当PHP看到包含activation_key查询string的请求时,会将用户标记为已激活。 如果用户已经激活,页面将显示“未知的validation链接”错误。

使用这些重写规则,请求会redirect到/login页面并显示错误,表明 – 我认为 – PHP已经看到了请求。

这是mod_fastcgiconfiguration:

 <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> 

如果我正确理解这一点:

  1. 你向/?activation_key=foobar发送一个请求,Apache发回一个响应,将你redirect到/login
  2. 你提出了/login的后续请求,该页面表示已经看到了validation链接。 但是这个请求中没有activation_key ,它只存在于第一个请求中。 它可能以前看过空string,这就是为什么现在抛出一个错误。 (您的PHP脚本中的确切逻辑可能与此解释不符,但我怀疑它是类似的。)

尝试改变你的重写规则,如下所示:

 RewriteCond %{QUERY_STRING} activation_key=[^&]* RewriteRule ^$ /login?activation_key=%1 [R,L] 

这捕获激活密钥,并将其传递给/login的下一个请求,以便PHP将有密钥。

在debugging的时候,可能值得您输出查询string或整个请求,甚至整个$_SERVER超级全局。


你最后一个重写规则有一个额外的/不需要在那里。 这将是一个更好的规则:

 RewriteRule ^ index.php [L] 

.htaccess文件和关联的AllowOverride all指令会带来性能损失。 当使用strace和查看所有文件操作来查找.htaccess文件可能隐藏的所有地方时,这变得非常明显。 如果您正在运行您自己的Apache服务器而不是共享主机,则可以将这些规则放在主configuration中,并将AllowOverride设置为无。 在一个<Directory>块里面,他们会像现在这样工作。 任何地方他们将需要一个额外的主导斜线。