htaccess redirect for non-www both http and https

.htaccess, http, https, redirect

Solution

Try this rule:

RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+$
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

Here’s an explanation:

- The first condition tests if the HTTP header field Host has the required format (contains exactly one period).

- The second condition tests if the concatenated value of the value of the HTTPS variable (values `on` and `off`) and `s` (so either `ons` or `offs`) is equal to `ons` and captures the `s`. This means if `%{HTTPS}s` evaluates to `ons`, the first matching group is `s` and empty otherwise.

- The rule will match all requests as every string has a start (marked with `^`) and redirects them to the evaluated value of `http%1://www.%{HTTP_HOST}%{REQUEST_URI}` if both conditions are true. Where `%1` is the first matching group of the previous condition (`s` if HTTPS and empty otherwise), `%{HTTP_HOST}` is the HTTP Host of the request and `%{REQUEST_URI}` is the absolute URL path that was requested.

Problem

I'd like to have: - `http://example.com` redirect to: `http://www.example.com` - `https://example.com` redirect to: `https://www.example.com` And anything that is `http://whatever.example.com` NOT append the www like `http://www.whatever.example.com`.

Original source