我在 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。”
这是完全可能的。以下将所有 http 重定向到 https url。
<VirtualHost *:80>
ServerName mydomainname.com
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
</VirtualHost>
确保加载重写模块 mod_rewrite 并启用它。
您的问题是初始 HTTP 请求:这将不起作用,因为服务器无法理解它在端口 443 上接收请求(如响应代码所示)。
如果未指定端口,则协议
http
默认为端口 80,https
为端口 443。
这也是本地重定向起作用的原因。我敢打赌,如果您通过
http://website/
访问该页面(具有正确的端口 80 端口转发),它也能正常工作。另请注意,无论如何,您的 VirtualHost
仅针对端口 80 定义,因此对于发送到 website:5443
(或 website:443
)的请求无效。
一般来说,您需要一台服务器在单个端口上接受 HTTP 和 HTTPS 请求。不确定任何流行的服务器实际上支持类似的东西,因为(我认为)它本质上违反了规范。
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
如果您想将您的网站从 http://anything.example.com 重定向到 https://anything.example.com ...只需创建一个专用托管 .conf 文件作为 /etc/httpd/conf.d/dedicated .conf和其他conf文件作为virtual.conf...专用.conf的条目如下....
这是托管 conf 文件的专用服务器,用于将其重定向到 https...
<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>
当有两个端口(一个用于 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 已经为我解决了。