系统:Ubuntu 14.04,Apache 2.4.7
我希望所有请求http://域名.com和https://domain.com重定向至https://domain.com。我还想将对“www”子域的请求重定向到主 domain.com 主机,而其他几个子域(tools.domain.com 和 phpmyadmin.domain.com)暂时仍可通过 http 访问。
所有这些都应该直接通过 domain.com 的虚拟主机配置文件完成(/etc/apache2/sites-available/domain.com.conf
完整内容如下),然后多次重新启动 apache2 服务。
重定向自http://域名.com到https://domain.com有效。重定向自http://www.domain.com到https://domain.com不起作用。重定向自https://www.domain.com到https://domain.com不起作用。
以下是虚拟主机文件内容:
<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>
更新:仅限https://www.domain.com不起作用
我真傻:问题超出了服务器的范围!我没有在 DNS 区域中配置任何“www”子域。我已更正此问题,现在几乎解决了。
答案1
_default_
表示默认
使用如下配置:
<VirtualHost _default_:80>
...
</VirtualHost>
<VirtualHost _default_:443>
...
</VirtualHost>
<VirtualHost *:*>
...
</VirtualHost>
最后一个虚拟主机在端口 80 和 443 上无法访问,因为这些端口上的任何请求都将由相关_default_
虚拟主机处理。*:*
虚拟主机可能根本不需要(您是否希望公共用户使用更多端口??)。
工作示例
因此,要让所有内容重定向到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>
请注意使用捕获所有内容的重写规则,因为使用重定向仅匹配一网址。
答案2
您尝试过使用 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]