系统:Ubuntu 14.04,Apache 2.4.7
我希望所有请求http://domain.com和https://domain.com被redirect到https://domain.com 。 我也想将请求redirect到“www”子域到主domain.com主机,而其他一些子域(tools.domain.com和phpmyadmin.domain.com)将暂时通过http保持访问。
所有这些都应该通过domain.com的虚拟主机configuration文件直接完成(下面的/etc/apache2/sites-available/domain.com.conf完整内容),然后重新启动apache2服务几次。
从http://domain.comredirect到https://domain.com工作。 从http://www.domain.com到https://domain.com的redirect不起作用。 从https://www.domain.com到https://domain.com的redirect不起作用。
这里是虚拟主机文件内容:
<VirtualHost *:*> ServerName www.domain.com Redirect permanent / https://domain.com/ </VirtualHost> <VirtualHost _default_:80> ServerName domain.com Redirect permanent / https://domain.com/ LogLevel error </VirtualHost> <VirtualHost *:80> ServerName tools.domain.com DocumentRoot /var/www/domain.com/subdomains/tools/public </VirtualHost> <VirtualHost *:80> ServerName phpmyadmin.domain.com DocumentRoot /usr/share/phpmyadmin </VirtualHost> <VirtualHost _default_:443> ServerName domain.com DocumentRoot /var/www/domain.com/public <Directory /var/www/domain.com/public> Require all granted </Directory> # SSL CERTIFICATES GnuTLSEnable on GnuTLSExportCertificates on GnuTLSCacheTimeout 500 GnuTLSCertificateFile /etc/ssl/certs/domain.com-certificate-125023.crt GnuTLSKeyFile /etc/ssl/private/domain.com.key GnuTLSPriorities NORMAL </VirtualHost>
愚蠢的我:问题超出了服务器! 我没有在我的DNS区域中configuration任何“www”子域名。 我纠正了,现在我几乎在那里。
_default_表示默认 像这样的configuration:
<VirtualHost _default_:80> ... </VirtualHost> <VirtualHost _default_:443> ... </VirtualHost> <VirtualHost *:*> ... </VirtualHost>
最后一个虚拟主机在端口80和443上无法访问,因为这些端口上的任何请求都将由相关_default_虚拟主机处理。 *:*虚拟主机可能根本不需要(您是否期望公共用户使用更多端口?)。
因此,要将所有内容redirect到https://example.com ,例如:
<VirtualHost *:443> ServerName example.com # SSL config ... </VirtualHost> <VirtualHost *:80> RewriteEngine On RewriteRule ^ https://example.com%{REQUEST_URI} [R=301,L] </VirtualHost> <VirtualHost *:443> # SSL config RewriteEngine On RewriteRule ^ https://example.com%{REQUEST_URI} [R=301,L] </VirtualHost>
请注意使用capture-everything重写规则,因为使用redirect只匹配一个 url。
你有没有尝试使用mod_rewrite? 你可以用下面的mod_rewrite规则来完成。
RewriteCond %{SERVER_PORT} 80 [OR,NC] RewriteCond %{HTTP_HOST} ^www\.domain\.com$ [NC] RewriteRule ^(.*)$ https://domain.com/$1 [R=301,L]