使用 Apache 将 HTTP 重定向到 HTTPS

问题描述 投票:0回答:5

我在 Ubuntu Server 12.04 上使用 mod_rewrite 强制使用 Apache 2.2.22 将 HTTP 请求重定向到 HTTPS 时遇到问题。

我的 /etc/apache2/sites-available/default 文件如下:

    <VirtualHost *:80>
        RewriteEngine On
        RewriteCond %{SERVER_PORT} !^443$
        RewriteRule ^/(.*) https://%{HTTP_HOST}/$1 [NC,R,L]
    </VirtualHost>

HTTPS 主机在同一目录下的 default-ssl 中定义。

访问服务器的本地IP地址,重定向似乎工作正常。但是,通过 FQDN 访问它却不然。使用 FQDN,该站点可在端口 5443 上使用,该端口在防火墙中映射到服务器上的 443,因此可能与该问题有关。我不能直接使用端口 443,因为另一台服务器正在使用该 IP 地址。

为了进一步澄清,以下是有效链接:

    https://website:5443
    https://192.168.200.80:443

重定向在这里起作用:

    http://192.168.200.80

但是下面给出了 400 Bad Request,这就是需要重定向的地方:

    http://website:5443/

“您的浏览器发送了该服务器无法理解的请求。 原因:您正在向启用 SSL 的服务器端口发送纯 HTTP。 请改用 HTTPS 方案访问此 URL。”

apache redirect mod-rewrite ubuntu
5个回答
11
投票

这是完全可能的。以下将所有 http 重定向到 https url。

<VirtualHost *:80>
    ServerName   mydomainname.com
    RewriteEngine On
    RewriteCond %{HTTPS} off
    RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
</VirtualHost>

确保加载重写模块 mod_rewrite 并启用它。


3
投票

您的问题是初始 HTTP 请求:这将不起作用,因为服务器无法理解它在端口 443 上接收请求(如响应代码所示)。

如果未指定端口,则协议

http
默认为端口 80,
https
为端口 443。

这也是本地重定向起作用的原因。我敢打赌,如果您通过

http://website/
访问该页面(具有正确的端口 80 端口转发),它也能正常工作。另请注意,无论如何,您的
VirtualHost
仅针对端口 80 定义,因此对于发送到
website:5443
(或
website:443
)的请求无效。

一般来说,您需要一台服务器在单个端口上接受 HTTP 和 HTTPS 请求。不确定任何流行的服务器实际上支持类似的东西,因为(我认为)它本质上违反了规范。


1
投票
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

0
投票

如果您想将您的网站从 http://anything.example.com 重定向到 https://anything.example.com ...只需创建一个专用托管 .conf 文件作为 /etc/httpd/conf.d/dedicated .conf和其他conf文件作为virtual.conf...专用.conf的条目如下....

这是托管 conf 文件的专用服务器,用于将其重定向到 https... th[][1]

<virtualhost *:80>
servername host.example.com
documentroot /var/www/html
rewriteengine on
RewriteRule ^/(.*) https://%{HTTP_HOST}/$1 [NC,R,L]
sslcertificatefile /etc/pki/tls/certs/name.crt
sslcertificatekeyfile /etc/pki/tls/private/name.key
</virtualhost>
<directory /var/www/html>
allowoverride all
require all granted
</directory>

或者,正如下面评论中提到的,我们也可以使用重定向:

<virtualhost *:80>
servername host.example.com
documentroot /var/www/html
RedirectMatch / https://host.example.com:ANY_PORT/ #if there is specific port
sslcertificatefile /etc/pki/tls/certs/name.crt
sslcertificatekeyfile /etc/pki/tls/private/name.key
</virtualhost>
<directory /var/www/html>
allowoverride all
require all granted
</directory>

0
投票

当有两个端口(一个用于 http,另一个用于 https)时,以前的解决方案可能会有所帮助。

但是,如果我们使用一个端口,那么这个问题没有 apache 的官方解决方案。

对我来说,我做了如下解决方案:

小心,使用文本编辑器编辑位于 ../apache/modules/ 的文件 mod_ssl.so 然后,搜索并替换该短语

You're speaking plain HTTP to an SSL-enabled server port.<br /> Instead use the HTTPS scheme to access this URL, please.<br />

通过您自己的消息。 有一个条件,两个短语的长度应该相等。

所以,我用了我自己的短语如下:

<script>window.location="https://"+location.host+location.pathname;</script>aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

这是用于重定向页面的 JavaScript 代码。 然后,从 http 切换到 https 已经为我解决了。

© www.soinside.com 2019 - 2024. All rights reserved.