Ikillnukes Ikillnukes - 10 days ago 6
PHP Question

Manage two domains pointing to one hosting with htaccess

Well, I want to know somebody me to explain, if possible, how could I manage one hosting to have two domains pointing to it.

My purpouse is to have two folders, and manage it with htaccess.

I have two parked domains in Hostinguer, now I want to know how can I make that the htaccess only allow one folder to one domain and the other folder to another domain, and take this to all the directories, because now, I can access my webpage by the two domains and I want to know how can I solve it.

My first try was this:

RewriteEngine On
RewriteCond %{HTTP_HOST} !^(www|)\.domain\.com$ [NC]
RewriteRule ^ - [F]


I know more or less what is every thing, there is a little bit of Regex and some instructions that says how it has to works.

Let's say something like that in PHP:

if($_SERVER['SERVER_NAME'] == "www.domain.com") //There is an regex I know
exit; //Or, in this case throw a 403 error.


But, for example, I don't know how can I apply this action to all the subdirectories, avoiding this two-three lines to every .htaccess in every folder.

And also, It didn't work as I expected, because, it throw me a 403 error if I visit it from my domain.com, but also, it throw me a 403 error if I visit it from my subdomain: http://ikillnukes.hol.es/fapi (I will leave it running all the night to prove it)

Note: I don't have access to the Apache, so, don't suggest me to make an virtualhost because I can't. ;-)

EDIT:

I have now:

domain1.com, domain2.com and sub.domain1.com

And those folders:

root
domain1 //This is created by me
sub //This is automatically created by Hostinger, and I can't change the name or the path
domain2 //This is created by me


So, there is any problem by doing what @Walf suggested to me, but I have the problem of the subdomains and the .htaccess @Walf provided to me is a little bit compilcated to understand (my fault), so, what can I should try?

So, any help to me explaining how to approach this would be fantastic!

Thanks in advance!

Answer

Your question is probably a duplicate but I can't find one that uses adjacent dirs (as I think you're describing), nor one with a solution I'd use, myself. Try this in your root .htaccess:

RewriteEngine on
# capture the original request so you never have trouble with (un)escaping
RewriteCond %{THE_REQUEST} \S+\s+(\S*)
RewriteRule ^ - [E=REQ:%1]
# ensure the domain goes to a dir with the same name (ignoring www)
#  get domain
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)
#  see if first dir in url doesn't match domain
RewriteCond %1 =!^(?>([^|]+)\|\1)$
#  capture first dir (if any) to check against above conditions and pass through as new url if not prefixed with domain dir
RewriteRule ^[^/]* %1%{ENV:REQ} [NE,DPI,PT]

Your dir structure would then be

docroot/
    domain1.com/
        whatever
    domain2.net/
        whatever
    .htaccess

You should then be able to have normal .htaccess directives in each subdir, if you wish. Ensure you use RewriteBase / in those dirs.


Re-edit That just makes your situation more like most others'.

RewriteEngine on
RewriteBase /
# capture the original request so you never have trouble with (un)escaping
RewriteCond %{THE_REQUEST} \S+\s+(\S*)
RewriteRule ^ - [E=REQ:%1]
# ensure the domain goes to the required dir
#  get domain
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)
RewriteRule ^ - [E=DOM:%1]
#  explicitly set dir per host
RewriteCond %{ENV:DOM} =sub.domain1.com [NC]
RewriteRule !^sub/ sub%{ENV:REQ} [NE,DPI,L]
RewriteCond %{ENV:DOM} =domain2.com [NC]
RewriteRule !^d2/ d2%{ENV:REQ} [NE,DPI,L]

# allow domain1.com to proceed to root (any other rules go below)
# rules must still exclude subdirectories for other domains, e.g.:
RewriteRule ^(?!sub/|d2/)([^/]+)/([^/.]+)$ foo.php?bar=$1&baz=$2 [NE,B,L,DPI]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule !^(?:sub/|d2/|index.\php$) index.php [L,DPI]

# after all other rules, emulate DirectorySlash so that Apache does not naively insert hidden directory into public URL
DirectorySlash off
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule (?>.*)(?<!/) %{ENV:REQ}/ [L,DPI,R]

If you're unsure of any regex, paste it into regex101.com (with the g flag off) and look at the explanation.