Dynamic server aliasing in apache webserver - apache

I have a usecase where I need to setup wildcard subdomains with condition so that for http://xyz.example.com type of request it should choose document root as /var/www/html/web and for http://xyz-portal.example.com it should choose document root as /var/www/html/admin. How this can be achieved?

Generate different virtualhosts with a default name resembling each case and then use ServerAlias for the wildcard. This is a example, adjust to your needs considering the following explanation.
Example:
<VirtualHost *:80>
ServerName www-portal.example.com
ServerAlias *-portal.example.com
DocumentRoot /var/www/html/admin
...
</VirtualHost>
<VirtualHost *:80>
ServerName www.example.com
ServerAlias *.example.com
DocumentRoot /var/www/html/web
...
</VirtualHost>
Explanation:
ServerName does not take in wildcards, so you must define it with the main "default" virtualhost name matching the scheme you want to use, then you use ServerAlias with wildcards or several entries to match all those domain requests that have to land in the same virtualhost
Note the xyz-portal.example.com must be defined first. Why? Because the generic wildcard of the other virtualhost serveralias "*.example.com" would match and grab the request if defined first. Apache selects virtualhost to reply based on Host header requested and first match in the order of loaded virtualhost wins.

Related

Virtualhost configuration not manage correctly requests

I have the following Virtualhost config in httlp-vhosts.conf:
<VirtualHost *:80>
ServerName rest.budgettracker.loc
DocumentRoot "C:/xampp/htdocs/budget-develop/budget-develop/api/public"
ErrorLog "logs/rest.budgettracker.loc-error.log"
CustomLog "logs/rest.budgettracker.loc-access.log" common
</VirtualHost>
<VirtualHost *:80>
ServerName dev.budgettracker.loc
DocumentRoot "C:/xampp/htdocs/budget-develop/budget-develop"
ErrorLog "logs/budgettracker.loc-error.log"
CustomLog "logs/budgettracker.loc-access.log" common
</VirtualHost>
When I enter dev.budgettrackerpro.com in the browser it goes to the rest.budgettrackerpro.loc virtualhost container.
If I remove the Virtualhost container for the rest request it directs correctly to the correct html/javascript code. Obviously I need the rest call to make it work correctly. I have researched this until I am blue in the face, what am I doing wrong? Please help
You are asking for dev.budgettrackerpro.com. Your configuration is for dev.budgettrackerpro.loc.
What happens is:
Apache sees that your request is on port 80 (http://...)
It checks which VirtualHost are configured to take traffic from port 80.
Here it finds 2. 1) rest.budgettracker.loc 2) dev.budgettracker.loc
Since the domain you asked (the .com) does not match either 1) or 2), Apache assumes that the VirtualHost it should use is the first one it found.
Apache when finding multiple VirtualHost or finding none that match uses the first one in the file (top to bottom).
To solve this:
Request http://dev.budgettracker.loc
Modify your VirtualHost to accept traffic form .com as well, like so:
<VirtualHost *:80>
ServerName dev.budgettracker.loc
ServerAlias dev.budgettracker.com
DocumentRoot "C:/xampp/htdocs/budget-develop/budget-develop"
ErrorLog "logs/budgettracker.loc-error.log"
CustomLog "logs/budgettracker.loc-access.log" common
</VirtualHost>
Notice the new line, ServerAlias dev.budgettracker.com. You can have multiple ServerAlias in a VirtualHost, but only one ServerName.

Apache Virtual Host using mod_vhost_alias

I am trying to set up my apache module to dynamically direct all requests to a specific folder and then match the name to a folder of the same name.
To do this I set the following in my 000-default.conf file in the sites-available folder.
UseCanonicalName Off
VirtualDocumentRoot /var/www/example/%2
This worked great.
Then I wanted to setup a couple of different domains to not point to the example folder, but somewhere else, so I added a couple of these before the VirtualDocumentRoot line:
<VirtualHost *:80>
ServerName sub1.example.com
VirtualDocumentRoot /var/www/sub1.example.com
</VirtualHost>
However, now the dynamic pointing does not work anymore and all the URL's are redirected to the first -> VirtualDocumentRoot location.
Can someone please indicate to me what I am doing wrong?
Full Code Example In apache2/sites-available/000-default.conf:
<VirtualHost *:80>
ServerName sub1.example.com
VirtualDocumentRoot /var/www/sub1.example.com
</VirtualHost>
<VirtualHost *:80>
ServerName sub2.example.com
VirtualDocumentRoot /var/www/sub2.example.com
</VirtualHost>
<VirtualHost *:80>
ServerName sub3.example.com
VirtualDocumentRoot /var/www/sub3.example.com
</VirtualHost>
UseCanonicalName Off
VirtualDocumentRoot /var/www/example/%2
Do not use VirtualDocumentRoot for simple Virtualhosts, use only DocumentRoot.
VirtualDocumentRoot defines the mass-virtualhost catch-all, and by definition you can only have one mass-virtualhost (else how could apache knows which VH a given hostname should match).
Edit:
Now you need some other changes:
- ensure you have NameVirtualHost *:80 somewhere in apache configuration (unless you use Apache 2.4).
- Move the Mass-Virtualhost as first, so it will become the default virtualhost. The default virtualhost is used when the request host name does not match any ServerName directive. (You can check the default VH by running apache with -S option).
I have figured out how to do this, and decided to post the solution here for anyone else sitting with a similar problem:
SO to setup apache2, using mod_vhost_alias to have all domains point to a generic folder with the same name, but specific domains to point elsewhere, this is what you need to do.
In your 000-default.conf site config file, write the following code:
UseCanonicalName Off
Then add the following block for each specific domain you want to point to a specific folder, replacing example.com with your domain name:
<VirtualHost *:80>
ServerName example.com
ServerAlias www.*
DocumentRoot path/to/your/folder
</VirtualHost>
Then add the next block to point all other generic domains to a generic folder:
<VirtualHost *:80>
ServerName vhosts.fqdn
ServerAlias www.*
VirtualDocumentRoot path/to/your/folder/%2+
</VirtualHost>
<VirtualHost *:80>
ServerName vhosts.fqdn
ServerAlias *
VirtualDocumentRoot path/to/your/folder/%1+
</VirtualHost>
The first block will direct all domains, starting with www. to a folder matching the name after the www.
The second block is to direct the same domains, when no www. is specified, to the same folder.
For more information on the dynamic mass virtual host options to use in the document root, go to: http://httpd.apache.org/docs/2.2/mod/mod_vhost_alias.html

whatever subdomain redirect to a specific folder

I have the following structure
webapp
website
.htaccess
and I have made a virtual host like the following
mydomain.com -> points to -> website
app.mydomain.com -> points to -> webapp
and I need to apply wildcard DNS concept to make any subdomain pointing to my webapp folder with keeping the subdomain in the url.
like
username.mydomain.com
company-name.mydomain.com
whatever.mydomain.com
and make them points to webapp folder
is there any virtual host or .htaccess way to do that?
Regards
According to Apache docs, the vhost resolution uses the definition order. The following config should do what you want :
<VirtualHost *:80>
ServerName www.yourdomain.com
ServerAlias yourdomain.com
DocumentRoot /www/yourdomain/website
</VirtualHost>
<VirtualHost *:80>
ServerName app.yourdomain.com
DocumentRoot /www/yourdomain/webapp
</VirtualHost>
<VirtualHost *:80>
ServerName *.yourdomain.com
DocumentRoot /www/yourdomain/customsubdomain
</VirtualHost>
Apache will route the request to the first vhost that matches the ServerName directive
yourdomain.com will match the first one
www.yourdomain.com will match the first one
app.yourdomain.com will match the second one
companyname..yourdomain.com the third one
username.yourdomain.com the third one
and so on...
*.yourdomain.com matches both app.yourdomain.com and www.yourdomain.com (but not yourdomain.com). So the wildcard (*) domain needs to be the last one in the file so it only catches request that aren't sent to www or app.

Apache Virtual Domains for staging

We're trying to set up a staging service for domains configured on a server.
At present we have the following in our DNS and it is pointing to our server correctly.
*.server001.stage.ourdomain.com.au
This serves the default site located at:
/Server/http/_default
What I would like it to do is load a site based by the information in place of the wildcard.
Example;
test.com.server001.stage.ourdomain.com.au
would return the contents of:
/Server/http/test.com
Remembering that we might be using .com.au domain names too, so there'd be a requirement for anything before the "server001" part.
You should define another <VirtualHost> block for test.com.server001.stage.ourdomain.com.au with its DocumentRoot pointing to /Server/http/test.com.
Something like this
<VirtualHost *:80>
ServerAdmin webmaster#test.com
DocumentRoot /Server/http/test.com
ServerName test.com.server001.stage.ourdomain.com.au
ErrorLog /var/logs/httpd/test.com/error_log
CustomLog /var/logs/httpd/test.com/access_log common
</VirtualHost>
<VirtualHost *:80>
ServerAdmin webmaster#server001.stage.ourdomain.com.au
DocumentRoot /Server/http/_default
ServerName *.server001.stage.ourdomain.com.au
ErrorLog /var/logs/httpd/server001.stage.ourdomain.com.au/error_log
CustomLog /var/logs/httpd/server001.stage.ourdomain.com.au/access_log common
</VirtualHost>
The wildcard VirtualHost should be the last one since apache picks up the first VirtualHost that matches.
Have a look at the Dynamically Configured Mass Virtual Hosting chapter in the manual. It basically explains how to use the VirtualDocumentRoot directive.

Htaccess non sensible subdomains

While I was searching for a hosting I found one called co.gp (they have more), so this hosting was great and I discovered something on it that it allows you to put any fakes subdomain you want for example.
If your website it's example.org the hosting allows you to put test1.example.org or test2.example.org.
I searched alot with the help of htaccess but I couldn't make one Like I'm looking for. So my question here. How Can I make fakes subdomains in my website ?
Ps : I don't want subdomains to be redirect for example if someone type test.example.org/something I want it to be the same as example.org/something.
Htaccess files will not be of much help here, because they are located under the document root, and are therefore evaluated after apache has determined which virtualhost points to this specific document root.
Assuming your DNS entries are well-configured, You should instead modify directly the apache main configuration.
If every subdomain points to a different document root, you will have to create a virtual host for each one:
<VirtualHost *>
ServerName example.org
DocumentRoot /path/to/example.org
# ...
</VirtualHost>
<VirtualHost *>
ServerName test1.example.org
DocumentRoot /path/to/test1.example.org
# ...
</VirtualHost>
If, instead, several subdomains point to a single document root, you can use the ServerAlias directive:
<VirtualHost *>
ServerName example.org
ServerAlias test1.example.org
DocumentRoot /path/to/example.org
# ...
</VirtualHost>
If all of the possible subdomains point to the same document root, you can relieve yourself from the pain of listing every subdomain in the ServerAlias list, and use a wildcard instead:
<VirtualHost *>
ServerName example.org
ServerAlias *.example.org
DocumentRoot /path/to/example.org
# ...
</VirtualHost>
There are of course more configurations directives needed to ensure each virtual host works properly, but these are the main building blocks you should understand to have a working setup.