如何将所有请求重定向到 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/的主要内容,如果未能解决你的问题,请参考以下文章

如何将所有 https 请求重定向到 https

如何通过 Web.config 或 C# 将所有内容重定向到 https://www。网站的版本?

如何通过 web.config 将 http 重定向到 https 并将 www 重定向到非 www?

通过 htaccess 将所有 http 和 https 非 www URL 重定向到 https://www.xyz.com

重定向所有非WWW HTTPS请求到www HTTPS

NGINX 将 http 重定向到 https,将非 www 重定向到 ww