89

Is it possible to use .htaccess to rewrite a sub domain to a directory?

Example:

  • http://sub.domain.example/

shows the content of

  • http://domain.example/subdomains/sub/

9 Answers 9

117

Try putting this in your .htaccess file:

RewriteEngine on RewriteCond %{HTTP_HOST} ^sub.domain.example RewriteRule ^(.*)$ /subdomains/sub/$1 [L,NC,QSA] 

For a more general rule (that works with any subdomain, not just sub) replace the last two lines with this:

RewriteEngine on RewriteCond %{HTTP_HOST} ^(.*)\.domain\.example RewriteRule ^(.*)$ subdomains/%1/$1 [L,NC,QSA] 
Sign up to request clarification or add additional context in comments.

14 Comments

Ansari's solution will work, however, it when I navigate to http://test.domain.com, the URL redirects me to http://test.domain.com/subdomains/test/. Is it possible without showing the /subdomains/test/ at the end?
In that case, I believe you will have to look into using mod_proxy and specify a P flag in addition to the L.
No, it redirects to http://test.domain.com/subdomains/test/, when I only want it to show http://test.domain.com/
I can't see how it redirects to test.domain.com/subdomains/test - maybe there is something else going on here. Can you add RewriteBase / right after RewriteEngine on? Also, if you want to keep it showing test.domain.com you will have to use mod_proxy and the [P] flag.
I was able to get it to work using @anubhava's answer here: stackoverflow.com/a/22395008/128984
|
53

I'm not a mod_rewrite expert and often struggle with it, but I have done this on one of my sites. It might need other flags, etc., depending on your circumstances. I'm using this:

RewriteEngine on RewriteCond %{HTTP_HOST} ^subdomain\.example\.com$ RewriteCond %{REQUEST_URI} !^/subdomains/subdomain RewriteRule ^(.*)$ /subdomains/subdomain/$1 [L] 

Any other rewrite rules for the rest of the site must go afterwards to prevent them from interfering with your subdomain rewrites.

6 Comments

I would say so. I found this setting is the right one as the same as my answer here.
Just as a reference, in case someone beginning with .htaccess comes to this page (like I did), besides creating the actual .htaccess file, for it to become effective, you need to set AllowOverride in your VirtualHost settings (stackoverflow.com/a/22819550/1657502), enable Apache's rewrite module and then restart Apache (stackoverflow.com/a/5758551/1657502)
This wont work if you use www to visit subdomain. @Minh solution will work in all cases.
@RohanKhude, do you mean if you want www.example.com and example.com to serve different content? Because usually, for SEO, you would have www.example.com to issue a permanent redirect to example.com or vice versa.
@RohanKhude www as a subdomain of a subdomain is also something you'd also have to get to work at the DNS level, isn't it? I think your expectation that it should work for any arbitrary subdomain is incorrect. Minh's answer (stackoverflow.com/a/41389905/30945) assumes your .htaccess configuration supports 1 and only 1 subdomain, so is less robust in that aspect. My solution supports as many subdomains as you need, but yes, you need to explicitly define every supported subdomain, but an optional www. prefix is probably best supported via a redirect than a rewrite.
|
22

You can use the following rule in .htaccess to rewrite a subdomain to a subfolder:

RewriteEngine On # If the host is "sub.domain.example" RewriteCond %{HTTP_HOST} ^sub.domain.example$ [NC] # Then rewrite any request to /folder RewriteRule ^((?!folder).*)$ /folder/$1 [NC,L] 

Line-by-line explanation:

 RewriteEngine on 

The line above tells the server to turn on the engine for rewriting URLs.

 RewriteCond %{HTTP_HOST} ^sub.domain.example$ [NC] 

This line is a condition for the RewriteRule where we match against the HTTP host using a regex pattern. The condition says that if the host is sub.domain.example then execute the rule.

 RewriteRule ^((?!folder).*)$ /folder/$1 [NC,L] 

The rule matches http://sub.domain.example/foo and internally redirects it to http://sub.domain.example/folder/foo.

Replace sub.domain.example with your subdomain and folder with name of the folder you want to point your subdomain to.

1 Comment

This is the correct answer for me - explanation of how I got here as follows. Arrived here looking for an age old problem with subdomain redirect that broke apparently when I installed SSL on the main site TLD. The redirect was initially still trying to use the main site TLD still and breaking security rules. What I needed was the keep the subdomain (that was on a completely different TLD) on the same host but away from the main site. Adding a rewrite rule as above enabled me to forward the complete subdomain to the folder hosted under the main TLD site.
8

I had the same problem, and found a detailed explanation in http://www.webmasterworld.com/apache/3163397.htm

My solution (the subdomains contents should be in a folder called sd_subdomain:

Options +FollowSymLinks -MultiViews RewriteEngine On RewriteBase / RewriteCond %{HTTP_HOST} !^www\. RewriteCond %{HTTP_HOST} subdomain\.domain\.example RewriteCond $1 !^sd_ RewriteRule (.*) /sd_subdomain/$1 [L] 

2 Comments

It doesn't work for me, must I configure something in the dns zone of the domain ?
@totoaussi you should create an * A record or an A record per subdomain, pointing to the same server.
4

This redirects to the same folder to a subdomain:

.httaccess

RewriteCond %{HTTP_HOST} !^www\. RewriteCond %{HTTP_HOST} ^([^\.]+)\.domain\.example$ [NC] RewriteRule ^(.*)$ http://domain\.example/subdomains/%1 

Comments

3

Try to putting this .htaccess file in the subdomain folder:

RewriteEngine On RewriteRule ^(.*)?$ ./subdomains/sub/$1 

It redirects to http://example.org/subdomains/sub/, when you only want it to show http://sub.example.org/.

2 Comments

The question was asked in 2012 and has 8 answers. Does your answer add value at this point?
This solution will work even if you use www to visit subdomain
2

Redirect subdomain directory:

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

Comments

-1

Edit file .htaccess:

RewriteEngine On RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] 

3 Comments

While this code may provide a solution to the question, it's better to add context as to why/how it works. This can help future users learn and eventually apply that knowledge to their own code. You are also likely to have positive-feedback/upvotes from users, when the code is explained.
An explanation would be in order.
This doesn't answer the question. This is an HTTP to HTTPS (same host) redirect, which has nothing to do with the question.
-1

For any sub domain request, use this:

RewriteEngine on RewriteCond %{HTTP_HOST} !^www\.band\.s\.example RewriteCond %{HTTP_HOST} ^(.*)\.band\.s\.example RewriteCond %{REQUEST_URI} !^/([a-zA-Z0-9-z\-]+) RewriteRule ^(.*)$ /%1/$1 [L] 

Just make some folder same as sub domain name you need. Folder must be exist like this: domain.example/sub for sub.domain.example.

1 Comment

This works for me but it doesn't keep the file. For example sub.domain.com/index.php throw 404

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.