9

Okay, I have done a fair amount of searching but still can't find something specific enough to handle my problem.

Right now I have a DNS record that redirects all other subdomains to my server. What I'm asking is what would make example.mydomain.com return HTTP/1.1 301 and redirect to just mydomain.com

My apologies if this has been covered, I just couldn't find anything specific enough.

Michael Berkowski
  • 267,341
  • 46
  • 444
  • 390
nkcmr
  • 10,690
  • 25
  • 63
  • 84
  • Note: ["How long do browsers cache HTTP 301"](https://stackoverflow.com/questions/9130422/how-long-do-browsers-cache-http-301s) and ["301 vs 302"](https://stackoverflow.com/questions/1393280/http-redirect-301-permanent-vs-302-temporary) – Martin Schneider Mar 12 '18 at 23:08

4 Answers4

19

Use a RewriteCond to match domains other than mydomain.com and 301 redirect them:

RewriteEngine On
# If the domain (any domain) is not exactly mydomain.com...
RewriteCond %{HTTP_HOST} !^mydomain\.com$ [NC]
RewriteRule (.*) http://mydomain.com/$1 [L,R=301,QSA]

You can also look more specifically for subdomains of mydomain.com. The one above would match any other domain.

# Match only subdomains of mydomain.com
RewriteCond %{HTTP_HOST} ^(.+)\.mydomain\.com$ [NC]
RewriteRule (.*) http://mydomain.com/$1 [L,R=301,QSA]
Michael Berkowski
  • 267,341
  • 46
  • 444
  • 390
  • @JorgeLuisBorges not only www. - it also matches _any subdomain_ `subdomain.mydomain.com` or anything other than exactly `mydomain.com` . The top example would also redirect `mydomain.org` to `mydomain.com` while the bottom matches only subdomains and would only redirect `subdomain.mydomain.com` to `mydomain.com` – Michael Berkowski Jul 15 '14 at 10:59
  • 1
    `RewriteRule (.*) http://example.com/$1 [L,R=301,QSA]` produces traling slashes, e.g. `www.example.com` redirects to `example.com//`. `RewriteRule (.*) http://example.com$1 [L,R=301,QSA]` seems to be correct. – Knut Holm Aug 16 '17 at 15:16
  • @akarienta It would depend on the context. If you use it in .htaccess or `` (if I recall), then the `(.*)` will not capture a leading `/`. But if you use it in a `` at the server level, it will include a leading `/`. There's a note about this in the docs: https://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewriterule – Michael Berkowski Aug 16 '17 at 15:38
  • @Michael Berkowski ah I see. Thanks for explanation! – Knut Holm Aug 17 '17 at 16:41
  • it's not working.I am using GoDaddy server.please help – Shivam Bhusri Dec 04 '17 at 18:48
2

In my case I need rule like foo.bar.com > bar.com/page/foo and I found in apache documentation this:

RewriteCond %{HTTP_HOST} ^(.+)\.bar\.com$ [NC]
RewriteCond %{HTTP_HOST} !www.bar.com$ [NC]
RewriteRule ^(.*)$ http://bar.com/page/%1/$1 [L,R=301]
Vasilii Suricov
  • 871
  • 12
  • 18
1

This article Covers .htacces and ModRewrite to redirect any request made to any domin other than the primary one redirect to the primary domain.

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} !www.newdomain.com$ [NC]
RewriteRule ^(.*)$ http://www.newdomain.com/$1 [L,R=301] 
mariusnn
  • 1,847
  • 18
  • 30
0

According to evan's blog, you might configure your ServerAlias with wildcard "*" if you make apache as your server side. Every visit to the subdomain will be redirected or routed to the root domain in this case.

<Virtualhost *:80>
VirtualDocumentRoot "/path/to/your/workspace/%1/public"
ServerName vhosts.dev
ServerAlias *.dev
UseCanonicalName Off
<Directory "/path/to/your/workspace/*">
    Options Indexes FollowSymLinks MultiViews
    AllowOverride All
    Order allow,deny
    Allow from all
</Directory>
</Virtualhost>
David
  • 3,843
  • 33
  • 36