如何将所有请求重定向到 https)://www.domain name.tld/
Posted
技术标签:
【中文标题】如何将所有请求重定向到 https)://www.domain name.tld/【英文标题】:How to redirect all requests to http(s)://www.domainname.tld/ 【发布时间】:2016-03-20 05:32:19 【问题描述】:我想设置我的 Apache 2.4 服务器以通过以下方式重定向所有请求:
http://domainname.tld/ 到 http://www.domainname.tld/
和
https://domainname.tld/ 到 https://www.domainname.tld/
我的vhost conf文件如下:
<VirtualHost *:80>
ServerName www.domainname.tld
ServerAlias www.domainname.tld
DocumentRoot ......
# other vhost settings
# ...
# ...
# ...
</VirtualHost>
<VirtualHost *:80>
ServerName domainname.tld
ServerAlias domainname.tld
Redirect "/" "http://www.domainname.tld/"
</VirtualHost>
<VirtualHost *:443>
ServerName www.domainname.tld
ServerAlias www.domainname.tld
DocumentRoot /..............
# SSL configuration
# ...
# ...
# ...
</VirtualHost>
<VirtualHost *:443>
ServerName domainname.tld
ServerAlias domainname.tld
Redirect "/" "https://www.domainname.tld/"
</VirtualHost>
我的 htaccess 文件中没有任何重写规则。
http 重定向工作正常,但如果我打开https://domainname.tld,我的请求将重定向到我服务器上的第一个虚拟主机配置。
请告诉我我的虚拟主机配置有什么问题?
据我所知,实现这种重定向的最佳方法是修改 vhost 配置,而不是在 htaccess 文件中添加重写规则。 解决这个问题的最佳方法根本不涉及 mod_rewrite,而是使用放置在虚拟主机中的 Redirect 指令用于非规范主机名。
请分享您的 cmets! 提前谢谢!
【问题讨论】:
htaccess redirect for non-www both http and https的可能重复 【参考方案1】:您的虚拟主机有多余的条目,因此您需要尝试清理它们。您仅将ServerAlias
用于您想要包含的其他域名。此外,您应该使用RedirectMatch
,因为您想使用mod_alias
而不是mod_rewrite
,因为如果不匹配,它将与主机名后面的URI 不匹配。
以这种方式尝试您的配置。
<VirtualHost *:80>
ServerName domainname.tld
RedirectMatch 301 "(.*)$" "http://www.domainname.tld$1"
</VirtualHost>
<VirtualHost *:80>
ServerName www.domainname.tld
DocumentRoot ......
# other vhost settings
# ...
# ...
# ...
</VirtualHost>
<VirtualHost *:443>
ServerName domainname.tld
RedirectMatch 301 "(.*)$" "https://www.domainname.tld$1"
</VirtualHost>
<VirtualHost *:443>
ServerName www.domainname.tld
DocumentRoot /..............
# SSL configuration
# ...
# ...
# ...
</VirtualHost>
确保您在更改后重新启动 Apache 并且您拥有有效的证书。而且 Apache 也在监听 443 端口。
【讨论】:
您好,感谢您的详细解答。我根据您的解释更改了我的 vhsot conf,HTTP 流工作正常,但 HTTPS 流再次回退到我的第一个 SSL 虚拟主机,它用于另一个域。也许我会尝试使用一些重写规则或 php 中的代码更改来将 https 重定向到 www。 所以你有多个 443 虚拟主机而不是显示的? 是的,没错 - 我的服务器上配置了多个虚拟主机。 其他可能有冲突。你可以发布你的其他人吗? 这是我的第一个虚拟主机的 conf 文件,在 domainname.tld 的情况下我的请求被重定向。 (非www)...pastebin.com/5JBZxGDn您认为这可能是浏览器问题吗?【参考方案2】:这篇文章解释了我的问题的解决方案:
如何在重定向多个虚拟主机时避免 SSL 证书不匹配错误 - 由于 SSL 协议封装了 HTTP 流量,因此必须正确添加或删除“www”子域。
https://www.tombrossman.com/blog/2014/avoid-certificate-mismatch-when-redirecting-multiple-ssl-virtualhosts/
<VirtualHost :443>
ServerName EXAMPLE-1.com
SSLEngine on
SSLCertificateFile /PATH/TO/CERT.crt
SSLCertificateChainFile /PATH/TO/CHAIN/FILE.pem
SSLCertificateKeyFile /PATH/TO/KEY.key
RewriteRule ^(.*)$ https://www.%HTTP_HOST%REQUEST_URI [L,R=301]
</VirtualHost>
<VirtualHost :443>
ServerName WWW.EXAMPLE-1.com
...
</VirtualHost>
您需要做的就是在重定向块内添加证书路径,以便可以在重定向之前进行密钥交换。
【讨论】:
以上是关于如何将所有请求重定向到 https)://www.domain name.tld/的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 Web.config 或 C# 将所有内容重定向到 https://www。网站的版本?
如何通过 web.config 将 http 重定向到 https 并将 www 重定向到非 www?
通过 htaccess 将所有 http 和 https 非 www URL 重定向到 https://www.xyz.com