2

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

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

示例 PHP 脚本 (ssl_test.php):

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

.ht 访问:

<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,如果不存在,我需要能够读取客户端证书。现在我可以做一个或另一个,但不能同时做。

4

0 回答 0