我对 apache2 和 Virtualhosts 有疑问。
我在 /apache2/sites-available/ownsites 中声明了一些内容以便通过不同的域和子域进行访问,例如:
<VirtualHost *:80>
ServerName www.domain1.de
ServerAlias domain1.de
DocumentRoot /var/www/domain1/
ServerAdmin myemailaddress.de
<Directory />
Order deny,allow
deny from all
</Directory>
<Directory /var/www/domain1>
Options -Indexes -FollowSymLinks
AllowOverride all
Order allow,deny
allow from all
</Directory>
</VirtualHost>
<VirtualHost *:80>
ServerName www.domain2.de
ServerAlias domain2.de
DocumentRoot /var/www/domain1/
ServerAdmin myemailaddress.de
<Directory />
Order deny,allow
deny from all
</Directory>
<Directory /var/www/domain2>
Options -Indexes -FollowSymLinks
AllowOverride all
Order allow,deny
allow from all
</Directory>
</VirtualHost>
一切正常,我可以访问不同的域和子域。但我启用了 SSL 才能安全访问我的 mail-webaccess
<VirtualHost *:443>
SSLEngine On
SSLCertificateFile /etc/apache2/certs/zarafa-ssl.crt
SSLCertificateKeyFile /etc/apache2/certs/zarafa-ssl.key
ServerName www.webaccess.domain1.de
ServerAlias webaccess.domain1.de
DocumentRoot /path/to/zarafa-webaccess/
ServerAdmin myemailaddress.de
#rewrite rule for https access
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule (.*) https://webaccess.domain1.de [R]
<Directory />
Order deny,allow
deny from all
</Directory>
<Directory /path/to/zarafa-webaccess/>
Options -Indexes -FollowSymLinks
AllowOverride None
Order allow,deny
allow from all
</Directory>
</VirtualHost>
此外,如果我尝试仅使用 http 进行访问,则此访问也可以正常工作,包括重写
但令人难以理解的是,现在如果我尝试使用 https 访问我的主域:https://www.domain1.de,即使我删除它,我也会重定向到 apache2-standard-index.html“它有效”。此外,如果我尝试使用 https 访问,我的另一个域名 www.domain2.de 也会重定向到我的第一个域名:https://www.domain2.de ->http://domain1.de
当我尝试一些 RewriteRules 时,也许 apache2 退出时还有其他文件保存着以前的 RewriteRules?
如果我声明其他规则来定义其他行为,则没有区别。
有谁遇到过同样的问题或知道如何解决吗?
答案1
http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewritecond
HTTPS
如果连接使用 SSL/TLS,则包含文本“on”,否则包含文本“off”。(无论是否加载 mod_ssl,都可以安全使用此变量)。
基本上,如果连接未使用 HTTPS,则 URL 为静态地重写为https://webaccess.domain1.de
。请求http://webaccess.domain1.de/dir/file.txt
?不,请求重写为https://webaccess.domain1.de
。
但这是一条愚蠢的规则,因为它所在的 VHost 被锁定到端口 443,因此它永远不会被以下连接击中:不是HTTPS。将此配置从配置中取出*:443
并将其放入相关的*:80
配置文件中。
更好的是,参考这个并使用这个:
RewriteEngine On
# This will enable the Rewrite capabilities
RewriteCond %{HTTPS} !=on
# This checks to make sure the connection is not already HTTPS
RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]
# This rule will redirect users from their original location, to the same location but using HTTPS.
# i.e. http://www.example.com/foo/ to https://www.example.com/foo/
# The leading slash is made optional so that this will work either in httpd.conf
# or .htaccess context
需要查找其他规则定义?查找 .htaccess 文件。
find /path/to/zarafa-webaccess/ -name '.htaccess'