ChatGPT解决这个技术问题 Extra ChatGPT

Generic htaccess redirect www to non-www

I would like to redirect www.example.com to example.com. The following htaccess code makes this happen:

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

But, is there a way to do this in a generic fashion without hardcoding the domain name?

It's important to be aware that if you don't use a www (or some other subdomain) then all cookies will be submitted to every subdomain amd you won't be able to have a cookie-less subdomain for serving static content thus reducing the amount of data sent back and forth between the browser and the server. Something you might later come to regret: twitter.com/codinghorror/statuses/1637428313
Another thing to consider, make sure you're setting the canonical name without the www in your pages, to avoid a possible duplicate content penalty. Also if you have absolute urls in your links make sure they're all non-www as well.
On my mind its better to keep the explicit redirection, especially when copying the configuration for another domain, that might require different tuning (www domain is better in some cases) weboptimizer.ch/2014/01/redirection-www
Any reason why this solution would work for all cases except the root url? For example domain.com does not piont to domain.com, whereas domain.com/page1 does redirect to domain.com/page1.
If you wish to redirect www to non-www whilst maintaining the protocol (HTTP or HTTPS) then see this related question: Redirecting www to non-www while maintaining the protocol HTTP or HTTPS

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

Same as Michael's except this one works :P


If it does not work, you are probably missing the RewriteEngine On precursor to make it work.
@Ben, how would I use this in reverse, to add www to a non-www website?
It redirects http://www.domain.com/ to http://domain.com//. You should add / to the RewruteRule. This works for me RewriteRule ^/(.*)$ http://%1/$1 [R=301,L].
I was having the same problem as Vladimir by it redirecting to http://domain.com// with the double slashes. So I did RewriteRule ^(.*)$ http://%1$1 [R=301,L] and it seems to be working so far
Please use the following solution rather than rewrite engine, it is much more faster while being elegant: stackoverflow.com/questions/1100343/…
N
Nhan

But if we need to do this for separate http and https:

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

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

www.example.com/ redirects to example.com// Any way to remove the extra slash?
Good question. I guess the quick solution will be to use additional rules (i.e. only for this case) before these described above. E.g.: RewriteCond %{HTTPS} off RewriteCond %{HTTP_HOST} ^www.example.com/$ [NC] RewriteRule ^(.*)$ http://www.example.com [R=301,L] ...
@BobbyS I used the solution in this article. It redirects www and HTTP to non-www HTTPS and also handles the trailing /.
You would only get an extra slash (at the start of the URL-path), if you'd placed these directives directly in the server config (or virtualhost). In .htaccess you should not be getting an extra slash. (Just to note, if you are performing this redirect in the server config then you probably shouldn't be using mod_rewrite to begin with... a simple mod_alias Redirect in the appropriate vhost container would be more efficient and less prone to error.)
D
Dmytro

Redirect non-www to www (both: http + https)

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

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

@nightcoder This is because my solution for inverse redirect (from non-www to www) as opposed to Andron's
Note: this solution might cause some problems if you intend to use subdomain names for other purposes. E.g., app.yourdomain.com will be redirected to www.app.yourdomain.com.
This is the exact opposite of an answer to the question.
I had to add RewriteEngine On and RewriteBase /, but otherwise worked well.
C
Community

If you want to do this in the httpd.conf file, you can do it without mod_rewrite (and apparently it's better for performance).

<VirtualHost *>
  ServerName www.example.com
  Redirect 301 / http://example.com/
</VirtualHost>

I got that answer here: https://serverfault.com/questions/120488/redirect-url-within-apache-virtualhost/120507#120507


S
Salman A

Here are the rules to redirect a www URL to no-www:

#########################
# redirect www to no-www
#########################

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

Here are the rules to redirect a no-www URL to www:

#########################
# redirect no-www to www
#########################

RewriteCond %{HTTP_HOST} ^(?!www\.)(.+) [NC]
RewriteRule ^(.*) http://www.%1/$1 [R=301,NE,L]

Note that I used NE flag to prevent apache from escaping the query string. Without this flag, apache will change the requested URL http://www.example.com/?foo%20bar to http://www.example.com/?foo%2250bar


can you write code to redirect http to https along with redirect www to non-www
Change the http:// to https:// to force it to HTTPS when it changes. You'll also want to add a regular http->https redirect for traffic that isn't being redirected by these rules.
V
Volomike
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^/(.*)$ https://%1/$1 [R]

The RewriteCond captures everything in the HTTP_HOST variable after the www. and saves it in %1.

The RewriteRule captures the URL without the leading / and saves it in $1.


sans leading "/" - In .htaccess (as stated in the question) there is no leading /, so the pattern never matches and the redirect never happens. (There is only a leading slash in a server or virtualhost context.) Also, if you have any mod_rewrite directives after this then you will need the L flag.
G
Greg

Try this:

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

If the host starts with www, we stick the whole host onto the start of the URL, then take off the "www."


RoBorg, unfortunately your settings don't work, if I try this: example.com/hello/world I end up here: example.com/hello/world/world I also had to add a slash after %{HTTP_POST} in the First RewriteRule
I'm using Apache/2.2.9 (Unix). It works for www.website, which redirects to website But for the following: website/test -> goes to: websitetest I fixed this by adding another / Second error: website/test/n goes to websitetest/n/n
Same issue as @deepwell with this one.
The issues that earlier readers are having is because these directives are intended for the server config (or vhost), not .htaccess. In a directory context (.htaccess) you should change the first RewriteRule to read: RewriteRule ^(.*)$ %{HTTP_HOST}/$1 [C,DPI] (requires Apache 2.2.12+). Note the addition of the slash and the DPI (Discard Path Info) flag - to prevent part of the URL-path being seemingly duplicated (which is in fact "path-info") as stated in earlier comments. However, there are simpler directives - as covered in the other answers.
G
Gregor Macgregor

Complete Generic WWW handler, http/https

I didn't see a complete answer. I use this to handle WWW inclusion.

Generic. Doesn't require domain info. Forces WWW on primary domain: www.domain.com Removes WWW on subdomains: sub.domain.com Preserves HTTP/HTTPS status. Allows individual cookies for domain / sub-domains

Please let me know how this works or if I left a loophole.

RewriteEngine On
RewriteBase /

# Force WWW. when no subdomain in host
RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+$ [NC]
RewriteCond %{HTTPS}s ^on(s)|off [NC]
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

# Remove WWW. when subdomain(s) in host     
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteCond %{HTTPS}s ^on(s)|off [NC]
RewriteCond http%1://%{HTTP_HOST} ^(https?://)(www\.)(.+\.)(.+\.)(.+)$ [NC]
RewriteRule ^ %1%3%4%5%{REQUEST_URI} [R=301,L]

The original question asks to redirect www to non-www. You're forcing the inclusion of www.
That was the only solution that worked for me, including folders and subfolders. I'm using .htaccess
D
Donny Kurnia

There can be a lot of misinformation out there about htaccess redirects, I find. First off, make sure your site is running on Unix using Apache and not on a Windows host if you expect this code to work.

RewriteEngine On

RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]

RewriteRule ^(.*)$ http://%1/$1 [R=301,L] 

(Make sure there are no line spaces between each line of text, though; I have added an extra space between lines so it renders okay in this window.)

This is one snippet of code that can be used to direct the www version of your site to the http:// version. There are other similar codes that can be used, too.


Why is your name Htaccess Redirect?
p
pelajar
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/subfolder/$1 [R=301,L]

For subfolder


R
Rajith Ramachandran

www to non www with https

RewriteEngine on

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

RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

R
Rick

For those that need to able to access the entire site WITHOUT the 'www' prefix.

RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^ http%{ENV:protossl}://%1%{REQUEST_URI} [L,R=301]

Mare sure you add this to the following file

/site/location/.htaccess 

This example is not complete - you are not setting the protossl environment variable (this is not a standard/server variable). This will always be empty, so will always redirect to http. (The idea behind setting protossl earlier in the code is for when you want to preserve the protocol when redirecting. However, these days you probably should be redirecting to https all the time.)
M
Manifest Man

Using .htaccess to Redirect to www or non-www:

Simply put the following lines of code into your main, root .htaccess file. In both cases, just change out domain.com to your own hostname.

Redirect to www

<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteCond %{HTTP_HOST} ^domain\.tld [NC]
  RewriteRule ^(.*)$ http://www.domain.tld/$1 [L,R=301]
</IfModule>

Redirect to non-www

<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteCond %{HTTP_HOST} ^www\.domain\.tld [NC]
  RewriteRule ^(.*)$ http://domain.tld/$1 [L,R=301]
</IfModule>

"change DOT to => . !!!" - why not just write a . in the first place?!
O
Oldskool

I used the above rule to fwd www to no www and it works fine for the homepage, however on the internal pages they are forwarding to /index.php

I found this other rule in my .htaccess file which is causing this but not sure what to do about it. Any suggestions would be great:

############################################
## always send 404 on missing files in these folders

    RewriteCond %{REQUEST_URI} !^/(media|skin|js)/

############################################
## never rewrite for existing files, directories and links

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-l

############################################
## rewrite everything else to index.php

    RewriteRule .* index.php [L]

You need to place non-www redirection rules before those you have quoted.
A
Amit Verma
RewriteEngine on
# if host value starts with "www."
RewriteCond %{HTTP_HOST} ^www\.
# redirect the request to "non-www"
RewriteRule ^ http://example.com%{REQUEST_URI} [NE,L,R]

If you want to remove www on both http and https , use the following :

RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.
RewriteCond %{HTTPS}s ^on(s)|offs
RewriteRule ^ http%1://example.com%{REQUEST_URI} [NE,L,R]

This redirects Non ssl

http://www.example.com

to

http://example.com

And SSL

https://www.example.com

to

https://example.com

on apache 2.4.* you can accomplish this using a Redirect with if directive,

<if "%{HTTP_HOST} =='www.example.com'">
Redirect / http://example.com/
</if>

M
Martijn Pieters

use: Javascript / jQuery

// similar behavior as an HTTP redirect
window.location.replace("http://www.stackoverflow.com");
// similar behavior as clicking on a link
window.location.href = "http://stackoverflow.com";

Or .htaccess:

RewriteEngine On
RewriteBase /
Rewritecond %{HTTP_HOST} ^www\.yoursite\.com$ [NC]
RewriteRule ^(.*)$ https://yoursite.com/$1 [R=301,L]

and The PHP method:

$protocol = (@$_SERVER["HTTPS"]    == "on") ? "https://" : "http://";

if (substr($_SERVER['HTTP_HOST'], 0, 4) !== 'www.') {
    header('Location: '.$protocol.'www.'.$_SERVER    ['HTTP_HOST'].'/'.$_SERVER['REQUEST_URI']);
    exit;
}

Ajax

$.ajax({
    type: "POST",
    url: reqUrl,
    data: reqBody,
    dataType: "json",
    success: function(data, textStatus) {
        if (data.redirect) {
            // data.redirect contains the string URL to redirect to
            window.location.href = data.redirect;
        }
        else {
            // data.form contains the HTML for the replacement form
            $("#myform").replaceWith(data.form);
        }
    }
});

w
wattostudios

The only way I got it to work...

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

v
vladkras

If you are forcing www. in url or forcing ssl prototcol, then try to use possible variations in htaccess file, such as:

RewriteEngine On
RewriteBase /

### Force WWW ###

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

## Force SSL ###

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

## Block  IP's ###
Order Deny,Allow
Deny from 256.251.0.139
Deny from 199.127.0.259

Apache can listen another port, e.g. 81. So instead of RewriteCond %{SERVER_PORT} 80 I suggest to use such more universal check: RewriteCond %{HTTPS} off
C
Community

This is updated to work on Apache 2.4:

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

The only change vs Michael's is to remove the [NC], which produces the "AH00665" error:

NoCase option for non-regex pattern '-f' is not supported and will be ignored


The earlier answer did not need "updating to work on Apache 2.4". The "warning" you are quoting (AH00665) relates to a different directive (eg. if you had something like RewriteCond %{REQUEST_FILENAME} !-f [NC]). The NC flag makes little difference in the above, however, the reason the NC flag should be used here is to catch the small fraction of bot traffic that (incorrectly) sends an uppercase hostname.
l
luky

The selected answer and many other solutions here dropped the the part of the url after /, so basically it always redirected to main domain, at least for me.. So i am adding working sample respecting full path after slash..

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

B
Bobík

Alternative approach if .htaccess customization is not ideal option:

I've created simple redirect server for public use. Just add A or CNAME record:

CNAME   r.simpleredirect.net
A       89.221.218.22

More info: https://simpleredirect.net


That website now says "This service will be closed soon."
l
local

I am not sure why u want to remove www. But reverse version would be:

# non-www.* -> www.*, if subdomain exist, wont work
RewriteCond %{HTTP_HOST} ^whattimein\.com
RewriteRule ^(.*)$ http://www.whattimein.com/$1 [R=permanent,L]

And advantage of this script is: if u have something like test.whattimein.com or any other (enviroments for developing/testing) it wont redirect U to the original enviroment.


Whether the www subdomain should be included or not is really a matter of personal preference and can depend on the domain name and target audience. The generic code posted above for redirecting www to none-www also handles test environments OK, since the redirect only occurs when the "www." subdomain is encountered.
This question does the opposite of what the user is asking, which is only polluting the post.
J
Jeaf Gilbert

Added if localhost, ignore redirection (for development purpose in local environment). If not localhost AND (not https OR it’s www), redirect to https and non-www.

RewriteEngine On

RewriteBase /
RewriteCond %{HTTP_HOST} !localhost [NC]
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

Please elaborate your code so that the OP understands how this answers the question.
C
Chirag Parekh

Hi you can use following rules on your htaccess file:

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

The question is asking for a "generic" solution that does not include the domain name. Your solution also does the complete opposite of what is asked for in the question (non-www to www, rather than www to non-www) without explanation.

关注公众号,不定期副业成功案例分享
Follow WeChat

Success story sharing

Want to stay one step ahead of the latest teleworks?

Subscribe Now