使用mod_rewrite时,Apache会丢弃SSL客户端证书

时间:2013-06-08 11:54:05

标签: php mod-rewrite apache2 ssl-certificate

我有一个PHP脚本,使用客户端证书对用户进行身份验证。 Apache被配置为需要为该脚本建立SSL连接,并且它正常工作。

但是,如果存在该文件,我还希望将对身份验证脚本的请求重定向到另一个文件。我正在使用mod_rewrite,如果存在其他文件,重定向也可以正常工作,但如果不存在,那么auth脚本将不再能够看到客户端证书。

示例PHP脚本(ssl_test.php):

<pre>
<?php
var_dump($_SERVER['SSL_CLIENT_VERIFY']);
echo "\n";
var_dump($_SERVER['SSL_CLIENT_CERT']);
?>
</pre>

htaccess的:

<IfModule mod_ssl.c>
    <Files ssl_test.php>
        SSLVerifyClient optional
        SSLVerifyDepth 2
        SSLOptions +StdEnvVars +ExportCertData +OptRenegotiate
    </Files>
</IfModule>

此时,如果我导航到ssl_test.php,它会显示客户端证书(SSL_CLIENT_VERIFY包含“SUCCESS”)。

现在我将以下内容添加到.htaccess:

RewriteCond %{REQUEST_URI} /ssl_test.php [NC]
RewriteCond foo.html -F
RewriteRule . foo.html [L]

如果存在foo.html,则会重定向对ssl_test.php的请求,因此该部分正在运行。但是,如果foo.html ,则ssl_test.php无法获取客户端证书 - SSL_CLIENT_CERT为空且SSL_CLIENT_VERIFY包含“NONE”。

这似乎发生在ssl_test.php与第一个RewriteCond指令匹配时,无论它是包含实际文件名还是包含与多个文件名匹配的正则表达式。如果我删除重写逻辑或更改正则表达式使其不再匹配ssl_test.php,它将再次开始工作。

有什么问题?我可能忽略了一些简单的东西,但我一直在浏览mod_rewrite和mod_ssl的文档,但找不到任何可以解释这种行为的文档。

为了澄清,我不需要将证书重定向到foo.html,这只是一个静态页面。如果foo.html存在,我需要将ssl_test.php重定向到foo.html,并且如果不存在则需要读取客户端证书。现在我可以做其中一个,但不能两个。

0 个答案:

没有答案