将所有的HTTP流量重定向到使用AWS ELB的HTTPS

10

所以我查看了其他类似的问题并提供了解决方案,但由于某些原因,它们中没有一个似乎起作用。首先,我的ELB已设置为

HTTP (incoming) -> HTTP (instance)
HTTPS (incoming) -> HTTP (instance)

因此,所有流量都应该通过端口80进入。这样可以正常工作,因为当我使用http://mydomain.comhttps://mydomain.com访问我的网站时,即使我仅在端口80上有一个VirtualHost,它也能够显示。

问题出在尝试将所有http流量重定向到https上。我曾尝试基于端口进行重定向(检查是否为!443并重定向到https),但现在由于所有流量都是通过80进入,所以这种方式行不通。因此,我使用Apache服务器并拥有以下重写规则:

RewriteEngine on
RewriteCond %{HTTP_HOST} www.(.+) [OR,NC]    # Added
RewriteCond %{HTTP:X-Forwarded-Proto} !https [NC]
RewriteRule ^/?(.*) https://mydomain.com%{REQUEST_URI} [L,R=301]

但它似乎从来没有起作用。我是否漏掉了其他行?有没有方法可以检查它是否满足该条件?我尝试将条件改为!httpshttp,但都没有起作用。

编辑:稍微修改了我的RewriteRule,现在仍然无法工作。我添加了一个额外的条件来重写www,那个有效。HTTP:X-Forwarded-Proto可能不存在或未由负载均衡器设置。

编辑:错误真的很愚蠢。我只是通过SSH连接到错误的实例。感谢您容忍我的愚蠢。

2个回答

6

要将http重写为https,请使用以下规则。
同时检查您的mod rewrite是否已启用并正常工作。

提示:mod_rewrite是Apache Web服务器中的一个模块,它可以通过重写URL来更改对资源的请求。
RewriteEngine On
# This will enable the Rewrite capabilities

RewriteCond %{HTTPS} !=on
# This checks to make sure the connection is not already HTTPS for "normal" conditions

RewriteCond %{HTTP:X-Forwarded-Proto} !https
# This checks the connection is not already HTTPS for AWS conditions

RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]
# This rule will redirect users from their original location, to the same location but using HTTPS.
# i.e.  http://www.example.com/foo/ to https://www.example.com/foo/
# The leading slash is made optional so that this will work either in httpd.conf
# or .htaccess context

7
这个解决方案不能与将https转换为http的ELB一起使用,会导致无限重定向循环。正确的解决方案(当负载均衡器存在时)是根据HTTP头中的X-Forwarded-Proto进行重定向。 - Gui Ambros
3
在上面添加了缺失的条件:RewriteCond %{HTTP:X-Forwarded-Proto} !https - Per Quested Aronsson

4

你的RewriteRule不正确,请参考这篇文章中的正确写法。


我尝试过了,但它没有起作用。而且我知道我的 RewriteRule 是正确的,因为我使用了一个规则路由 www,那个可以运行。有没有办法检查 HTTP:X-Forwarded-Proto 是否设置? - user1561753

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接