10

So I've looked over the other similar questions and they offer solutions but none of them seem to work for some reason. So, for starters, my ELB is set up so that

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

So both traffic should come in on port 80. And this works, as when I access my site using http://mydomain.com or https://mydomain.com, it is able to display even though I only have a VirtualHost for on port 80.

The issue is with attempting to rewrite all http traffic to https. I use to do it based on ports (check if !443 and rewrite to https) but that won't work now that everything is going into 80. So I'm running an Apache server and have this rewrite rule

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]

But it never seems to work. Are there other lines I'm missing? Is there a way to check that it's hitting that condition? I tried both !https and http as the condition and neither worked.

edit: Slightly changed my RewriteRule to what it is now and it's still not working. I added an extra condition to rewrite www and that works. HTTP:X-Forwarded-Proto either isn't there or isn't set by the load balancer

edit: The mistake was REALLY dumb. I was simply SSHing into the wrong instance. Thanks for putting up with my foolishness

user1561753
  • 357
  • 2
  • 3
  • 13

2 Answers2

6

To rewrite from http to https use following rules.
Also check if your mod rewrite is enabled and working properly.

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
Per Quested Aronsson
  • 11,380
  • 8
  • 54
  • 76
hemc4
  • 1,623
  • 3
  • 18
  • 32
  • 7
    This solution will *not* work with ELB doing https->http translation, and will create an infinite redirect loop. The correct solution (when a load balancer is present) is really to look into the HTTP headers for X-Forwarded-Proto, and redirect accordingly. – Gui Ambros Oct 16 '14 at 02:23
  • 3
    Added the missing condition above: RewriteCond %{HTTP:X-Forwarded-Proto} !https – Per Quested Aronsson Apr 28 '16 at 12:35
4

It's just your RewriteRule which is not valid. Please see this post on how it should look.

Knut
  • 1,792
  • 13
  • 9
  • I tried that and it's not working. And I KNOW my RewriteRule is correct because I made a rule routing www too and that worked. Is there any way to check that the HTTP:X-Forwarded-Proto is set? – user1561753 May 19 '14 at 16:38