7

There's a few similar questions which I tried to work out the answer from, but so far I have been unsuccessful. Please advise how I can always redirect http to https (and also remove www. from the hostname in the process). Also a side note, it would be nice to do this inside the main Apache conf rather than .htaccess - but I imagine this will not apply to most people.

Update:

I've added this snippet to a VirtualHost section:

RewriteCond %{HTTP_HOST} ^www\.(.*)
RewriteRule ^.*$ https://%1/$1 [R=301,L]

... but it has no effect when I access http://www.domain (it should redirect to https://domain)

Update 2:

It had no effect because I did not use RewriteEngine on - so it works now:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.(.*)
RewriteRule ^.*$ https://%1/$1 [R=301,L]
Nick Bolton
  • 5,016
  • 12
  • 51
  • 62
  • What's wrong with all the other answers? How have you been unsuccessful? Also, there's pretty much no difference between doing this in .htaccess and your main Apache config file. –  Feb 24 '10 at 12:02
  • When using in the main conf file: `Invalid command 'RewriteEngine', perhaps misspelled or defined by a module not included in the server configuration` – Nick Bolton Feb 24 '10 at 12:04
  • What does your server configuration look like? – Gumbo Feb 24 '10 at 12:06
  • Snippet from a `VirtualHost` section: http://pastebin.com/Zp5Qc6FA – Nick Bolton Feb 24 '10 at 12:08
  • You might want to update your question with the details you've put in your comment about the error you're getting. – Andrew Aylett Feb 24 '10 at 12:13
  • @Nick Bolton: The error message says “Invalid command 'RewriteEngine' …”. You should show us in what context you use that directive. – Gumbo Feb 24 '10 at 12:15
  • Oops, rookie mistake - the mod wasn't loaded, but it is now (thanks Andrew Aylett). So on to my question, how do I do what I want to do? – Nick Bolton Feb 24 '10 at 12:16
  • I think this would be more at home on Server Fault than SO. – jmtd Feb 24 '10 at 12:20
  • jmtd: hmm, yes you're right. Hopefully the mods will migrate this. There are also a number of other Apache conf questions on SO. – Nick Bolton Feb 24 '10 at 12:22
  • @Nick Bolton: As you wish. – Gumbo Feb 24 '10 at 12:24

5 Answers5

18

There are so many solutions:

RewriteEngine On
RewriteCond %{HTTPS} !^on$
RewriteRule (.*) https://yourdomain/$1 [R,L]
coding Bott
  • 568
  • 1
  • 4
  • 13
  • 1
    I like this answer the best, because it's very concise on https. To extend it to work with any domain... RewriteCond %{HTTPS} !^on$ RewriteCond %{HTTP_HOST} ^(.*)$ [NC] RewriteRule ^.*$ https://%1%{REQUEST_URI} [L,R=301] – Mark Shust at M.academy Jul 17 '16 at 13:18
5

If you're using a load balancer you'll need to use a different conditional. This works for AWS ELB:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{HTTP:X-Forwarded-Proto} !https
    RewriteRule (.*) https://yourdomain.com/$1 [R=301,L]
</IfModule>
Chief
  • 151
  • 1
  • 3
4

two solutions . add either of them to your .htaccess

RewriteEngine on
RewriteCondition %{SERVER_PORT} !^443$
RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L] 

RewriteEngine On 
RewriteCond %{SERVER_PORT} 80 
RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]
3

I wouldn't use mod_rewrite, you can achieve it simply with mod_alias:

Redirect permanent / https://other-site

Where 'other-site' is the hostname you want to redirect to, ommitting the www. prefix that you do not want.

jmtd
  • 575
  • 2
  • 6
  • Ok, this worked, but only for the `VirtualHost *:80`, so in *:443 I will try to use a snippet similar to my answer. – Nick Bolton Feb 24 '10 at 12:45
1

From your comments, it sounds like you're not including mod_rewrite:

LoadModule rewrite_module modules/mod_rewrite.so
Andrew Aylett
  • 599
  • 3
  • 14