7

我在使用 mod_rewrite 在 Ubuntu Server 12.04 上使用 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。”

4

4 回答 4

9

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

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

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

于 2014-08-08T19:38:52.357 回答
3

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

如果未指定端口,则协议http默认为端口 80,https端口为 443。

这也是您的本地重定向有效的原因。我敢打赌,如果您通过http://website/(通过端口 80 的正确端口转发)访问该页面,它也可以正常工作。另请注意,无论如何您只为端口 80 定义,因此它对发送到(或)VirtualHost的请求无效。website:5443website:443

通常,您需要一台在单个端口上同时接受 HTTP 和 HTTPS 请求的服务器。不确定任何流行的服务器是否真的支持这样的东西,因为(我认为)它本质上违反了规范。

于 2013-07-25T09:23:10.327 回答
0

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

这是用于将其重定向到 https 的专用服务器托管 conf 文件... 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>
于 2016-10-23T17:48:02.377 回答
-1
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
于 2017-06-01T07:27:13.103 回答