![Apache mod_rewrite 在 SSL 和非 SSL 配置上的行为不同](https://linux22.com/image/578909/Apache%20mod_rewrite%20%E5%9C%A8%20SSL%20%E5%92%8C%E9%9D%9E%20SSL%20%E9%85%8D%E7%BD%AE%E4%B8%8A%E7%9A%84%E8%A1%8C%E4%B8%BA%E4%B8%8D%E5%90%8C.png)
我有一个系统,在我的服务器上托管了许多 SSL 站点。我还需要为每个域设置 OAuth,特别是 Google 和 Yahoo。它们都要求在服务器上安装验证文件,以验证所有权。现在这些文件太多了,以至于它们堵塞了我的根目录。所以我想设置一个重写规则,将对特定 URL 的请求发送到验证文件目录,如下所示:
RewriteRule (^/googlew*.html$) /verifications$1
这将发送 Google 验证文件请求,例如http://服务器/google27c81d94580e55dd.html到http://服务器/verifications/google27c81d94580e55dd.html,并且无需重写 URL 就可以正常工作。
但是当请求转到 SSL URL 时,它会失败。这是我的配置:
<VirtualHost *:80>
ServerName <domain>
DocumentRoot /www/public
RewriteEngine On
RewriteRule (^/googlew*.html$) /verifications$1 [R]
RewriteRule (^.*--.html$) /verifications$1 [R]
</VirtualHost>
<VirtualHost <ipaddress>:443>
SSLEngine On
ServerName <domain>
DocumentRoot /www/public
RackEnv production
RewriteEngine On
RewriteRule (^/googlew*.html$) /verifications$1 [R]
RewriteRule (^.*--.html$) /verifications$1
SSLProtocol all
SSLCipherSuite HIGH:MEDIUM
SSLCertificateChainFile /usr/share/ssl/crt/intermediate.crt
SSLCertificateFile /usr/share/ssl/crt/<domain>/<domain>.crt
SSLCertificateKeyFile /usr/share/ssl/crt/<domain>/<domain>.key
</VirtualHost>
因此,当请求为非安全 HTTP 时,它可以正常工作。当请求为安全 HTTPS 时,它会失败。有什么建议可以解释原因吗?
更新根据要求,这是第 3 级重写日志的输出:
init rewrite engine with requested uri /google27c81d94580e55dd.html
applying pattern '(^/googlew*.html$)' to uri '/google27c81d94580e55dd.html'
applying pattern '(^.*--.html$)' to uri '/google27c81d94580e55dd.html'
pass through /google27c81d94580e55dd.html
现在有一件有趣的事情:在我发表原始帖子之前,正如我所说,非安全版本运行良好。在我发表帖子之后,非安全版本也停止工作了!我刚刚粘贴的日志条目是我在运行非安全版本时得到的。脸。爆炸。
答案1
一些东西:
- 父母不应该在你
^
身边$
。 - 您可能指的是
\w*
, 而不是w*
; 来匹配这些字符。 - 确保转义特殊字符
那么,尝试一下这个:
RewriteRule ^(/google\w*\.html)$ /verifications$1 [R]
我没有理解你的第二条规则的目的;你能澄清一下吗?