How to dynamically redirect www-based URLs to non-

2019-03-16 02:50发布

问题:

I've got a VirtualHost that looks something like:

<VirtualHost *:80>

  ServerName  domain1.com
  ServerAlias www.domain1.com domain2.com www.domain2.com

</VirtualHost>

When someone visits www.domain1.com/test, they should be redirected to:

domain1.com/test

When someone visits www.domain2.com/test, they should be redirected to:

domain2.com/test

My current RewriteRules are lacking.

Edit: Here's what I've got so far:

# Rewrite www to non-www
RewriteEngine on
RewriteCond %{HTTP_HOST} www\.%{HTTP_HOST}$ [NC]
RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1 [L,R=301]

Obviously, this generates an infinite redirect loop.

回答1:

Your RewriteCond is a bit wonky. I'm surprised it does anything at all, since it would seem to be trying to match the host www.domain1.com against the pattern www\.www.domain1.com. These directives worked for me:

# Redirect www to non-www
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^(.*)$ http://%1$1 [L,R=301]


回答2:

No need for rewrites.

<VirtualHost *:80>
    ServerName domain1.com
    ServerAlias domain2.com
    ... real vhost settings ...
</VirtualHost>

<VirtualHost *:80>
    ServerName www.domain1.com
    Redirect permanent / http://domain1.com/
</VirtualHost>
<VirtualHost *:80>
    ServerName www.domain2.com
    Redirect permanent / http://domain2.com/
</VirtualHost>


回答3:

You can have multiple VirtualHosts in a configuration file, so you should change your config to this:

<VirtualHost *:80>
    ServerName domain1.com
    ServerAlias www.domain1.com
</VirtualHost>

<VirtualHost *:80>
    ServerName domain2.com
    ServerAlias www.domain2.com
</VirtualHost>

You can add another VirtualHost for each domain you want to do.