ubuntu 使用Apache将HTTP重定向到HTTPS

brqmpdu1  于 11个月前  发布在  Apache
关注(0)|答案(5)|浏览(252)

我在Ubuntu Server 12.04上使用mod_rewrite强制将HTTP请求重定向到HTTPS时遇到了一个问题。
我的/etc/apache 2/sites-available/default文件如下:

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

字符串
HTTPS主机在同一目录中的default-ssl中定义。
访问服务器的本地IP地址,重定向似乎工作正常。但是,通过路由器访问它,它不工作。使用路由器,该站点在端口5443处可用,该端口在防火墙中Map到服务器上的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。”

ar5n3qh5

ar5n3qh51#

这是完全可能的。下面的重定向所有http到https的网址。

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

字符串
确保你加载重写模块mod_rewrite并启用它。

tkclm6bt

tkclm6bt2#

这里的问题是初始HTTP请求:这将不起作用,因为服务器不会理解它在端口443上接收请求(如响应代码所示)。
如果未指定端口,则协议http默认为端口80,https默认为端口443。
这也是为什么你的本地重定向工作的原因。我敢打赌,如果你通过http://website/访问页面(正确的端口转发端口80),它也会工作。还要注意,你的VirtualHost只定义了端口80,所以它不会对发送到website:5443(或website:443)的请求有效。
一般来说,你需要一个服务器在一个端口上同时接受HTTP和HTTPS请求。不确定任何流行的服务器是否真的支持这样的东西,因为(我认为)它本质上违反了规范。

b5lpy0ml

b5lpy0ml3#

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

字符串

ajsxfq5m

ajsxfq5m4#

如果你想重定向您的网站从http:anything.example.com到https://anything.example.com.只需创建一个专用的主机.conf文件为/etc/httpd/conf.d/dedicated.conf和其他conf文件为virtual.conf.
这是专用服务器托管conf文件重定向到https. x1c 0d1x

<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>

3z6pesqy

3z6pesqy5#

如果有两个端口,一个用于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的交换已经为我解决了。

相关问题