Apache,通配符SSL和mod_rewrite

我有一个通配SSL证书,工作正常:

<VirtualHost *:443> ServerName star.mydomain.com DocumentRoot /dev/null SSLEngine On SSLCertificateFile /etc/httpd/conf.d/star.mydomain.com.crt SSLCertificateKeyFile /etc/httpd/conf.d/star.mydomain.com.key SSLCertificateChainFile /etc/httpd/conf.d/star.mydomain.com.gd_bundle.crt </VirtualHost> 

然后,我有在SSL端口上侦听的各个子域:

 <Virtualhost *:80 *:443> ServerName staging.mydomain.com DocumentRoot /var/www/staging.mydomain.com/ CustomLog logs/staging.mydomain.com.log combined AccessFileName .htaccess DirectoryIndex index.php index.html </VirtualHost> <Virtualhost *:80 *:443> ServerName www.mydomain.com DocumentRoot /var/www/www.mydomain.com/ CustomLog logs/www.mydomain.com.log combined AccessFileName .htaccess DirectoryIndex index.php index.html </VirtualHost> 

这是伟大的。 我可以去http://staging.mydomain.com/或https://staging.mydomain.com/ ,一切都很开心。

现在诀窍是,据我所知,有知道的方式来知道在这个configuration请求是否SSL。

例如,即使是SSL请求,所有环境variables都指向非SSL的请求。 我怀疑这是由于mod_ssl的实现。

特别是,我想在虚拟主机中做这样的事情:

 RewriteCond %{SERVER_PORT} 80 RewriteCond %{REQUEST_URI} dashboard RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L] 

但是我得到一个redirect循环,因为即使在SSL下,SERVER_PORT始终为80。

我也尝试在第一个star.mydomain.com虚拟主机中添加一个SetEnv IS_SSL 1,但该variables也不适用于mod_rewrite。

在不为每个域创build单独的ssl / non-ssl虚拟主机的情况下,是否有这样的工作方式?

谢谢!

我build议看看HTTPSvariables ,这应该是一个可靠的指标,目前的连接是否使用HTTPS。 你应该可以做这样的事情:

 RewriteCond %{HTTPS} off RewriteRule ^/dashboard.* https://%{HTTP_HOST}%{REQUEST_URI} [L,R] 

我build议使用[R]标志强制外部redirect,因为根据文档,Apache检查redirect的URL中的主机名是否与当前请求中的主机名相同,如果是,则剥离该scheme和主机名,并只使用URLpath进行内部重写(这意味着它将忽略https://重写规则的一部分)。