I would like to have subdomains for my web app like so:
company1.mysite.com
company2.mysite.com
How do I go about doing this? Do I need a virtual host set up per company?
Or can I have a catchall like:
*.mysite.com
What's the typical approach here?
My thoughts on how to show the correct content is that I will take the prefix part of the URL, check the database for the id of that company, and then just use the id to bring back the correct content...
The problem is that i'm unsure of how to create subdomains programmatically in PHP and Apache.
I am using Windows (so locally I will be editing the windows host file)
First You've to define wildcard rule in your dns server.
For example in bind (linux and etc.) I do like this:
somedomain.com. IN A 111.222.222.222
*.somedomain. IN A 111.222.222.222
and then in virtualhost file add this:
NameVirtualHost *:80
<VirtualHost *:80>
ServerName somedomain.com
ServerAlias *.somedomain.com
DocumentRoot /var/www/public
</VirtualHost>
this example for one big single application that get subdomain and works with it's logic.
so if every app is separate then:
<VirtualHost *:80>
ServerName somedomain.com
ServerAlias *.somedomain.com
VirtualDocumentRoot /var/www/%1/public
</VirtualHost>
Related
Good day to all, I am new to Laravel and I wonder what is the reason to create vhost for localhost like
<VirtualHost *:80>
DocumentRoot "C:/xampp/htdocs"
ServerName localhost
</VirtualHost>
And then create vhost for Laravel project like
<VirtualHost *:80>
DocumentRoot "C:/xampp/htdocs/MyProject/public"
ServerName test.me
</VirtualHost>
Well, it is clear in terms of the creation of vhost for Laravel project but it is unclear why to create for just localhost and is it ok if I remove it(the localhost vhost)
There's no technical requirement for this. Each vhost is in fact separate entity, despite the fact the share some part of DocumentRoot path. You do not need two virtual hosts set up to make things work in your case, nor these vhosts are connected nor depend on each other in any way. The localhost vhost is simply for your (potential) convenience but you can safely get rid of it if you do not find it that useful or needed at all.
So that you don't need to open your project in your browser like this "http://localhost/MyProject/public". It is way simpler just to type: myproject.dev, right? :)
EDIT:
And this:
<VirtualHost *:80>
DocumentRoot "C:/xampp/htdocs"
ServerName localhost
</VirtualHost>
Is needed so that your http://localhost is still available.
Yesterday i have created a new site on my Codero Dedicated Server. and i have not assigned any domain name yet to the ip address.
Currently i am able to access my site with http://MySiteIpAddress/~username but i want to access it with only http://MySiteIpAddress/. Is there any way to do it. I don't know if that's possible by htaccess rules, so any hints are appreciated.
You want to setup a virtual host and point it to the folder you want.
See this other post for more details.
You need to do several steps in order to make this work.
1.) Update the hosts file. On Windows XP, you can find it under c:\WINDOWS\system32\drivers\etc\. You should already see the first
line from below, it takes care of your mentioned other project. - add
the additional ones to make any requests to the mentioned virtual
hosts routed back to your own machine.
127.0.0.1 localhost
127.0.0.1 foo-bar.com
127.0.0.1 abcdef.com
127.0.0.1 qwerty.com
2.) Update the vhosts file in Apache configuration. Under your XAMPP folder, add the following to
apache\conf\extra\httpd-vhosts.conf and if needed change the ports
(i.e. if you use 8080 instead of port 80).
<VirtualHost *:80>
DocumentRoot C:/xampplite/htdocs/foo-bar/
ServerName www.foo-bar.com
</VirtualHost>
<VirtualHost *:80>
DocumentRoot C:/xampplite/htdocs/abcdef/
ServerName www.abcdef.com
</VirtualHost>
<VirtualHost *:80>
DocumentRoot C:/xampplite/htdocs/qwerty/web/
ServerName www.qwerty.com
</VirtualHost>
3.) Do a quick configuration check. Open {XAMPP-folder}\apache\conf\httpd.conf your file and make sure that
the following part is not commented out by a preceeding # character:
Include conf/extra/httpd-vhosts.conf
4.) Restart XAMPP.
... and you should be all setup now. Your other project should
be accessible at the URI you mentioned if you just put it under
C:/xampplite/htdocs/my-project/.
My Apache "httpd-vhosts.conf" looks like this::
<VirtualHost *:80>
DocumentRoot "c:/wamp/www/"
ServerName localhost
ServerAlias *.localhost
</VirtualHost>
<VirtualHost laravel.dev:80>
DocumentRoot "c:/wamp/www/laravel/public"
ServerName laravel.dev
ServerAlias *.laravel.dev
</VirtualHost>
<VirtualHost learninglaravel.dev:80>
DocumentRoot "c:/wamp/www/learningLaravel/public"
ServerName learningLaravel.dev
ServerAlias *.learningLaravel.dev
</VirtualHost>
and my "...system32/drivers/etc/hosts" also looks like this::
127.0.0.1 localhost
127.0.0.1 localhost
// I added the following entries. The first two entries above was already there
127.0.0.1 laravel.dev
127.0.0.1 learninglaravel.dev
When i enter "learningLaravel.dev" and "laravel.dev" into the browser, they work fine as expected. But i have other folders in my "www" folder that i use them to learn PHP and i want to be able to access the files in those folders directly from the browser like say "localhost/test/me.php". But anytime i enter such address the browser goes to the second entry in the vhosts-conf file [which prints a laravel error meaning that it can't find the file]. It seems that the first entry in the vhosts-conf file is not working and Apache bypasses it to the second entry. The first entry is suppose to be the catch all entry. I tried to swap the second and third entries to see how it will behave but it always direct the browser to the second entry instead of the catch all (first entry) that is suppose to handle addresses likes "localhost/test/me.php"
Anytime i enter only "localhost" into the browser, it goes straight to the second entry instead of say printing the contents of the "www" folder.
How do i solve this problem? thanks.
It seems the problem comes from the way you use the VirtualHost directive.
Using a fully qualified domain name for the IP address of the virtual host is not recommended. It is misleading how it works. Name based virtual hosts determine the host through the ServerName directive, and not through the FQDN in the VirtualHost directive (<VirtualHost FQDN:80>). In fact this is seen as <VirtualHost 127.0.0.1:80>
What happens is your case is documented in the VirtualHost doc, last 2 paragraphs (just before "Security"), quoted:
When a request is received, the server first maps it to the best
matching based on the local IP address and port
combination only. Non-wildcards have a higher precedence. If no match
based on IP and port occurs at all, the "main" server configuration is
used.
If multiple virtual hosts contain the best matching IP address and
port, the server selects from these virtual hosts the best match based
on the requested hostname. If no matching name-based virtual host is
found, then the first listed virtual host that matched the IP address
will be used. As a consequence, the first listed virtual host for a
given IP address and port combination is the default virtual host for
that IP and port combination.
So when you ask for localhost/somedir, the server will try to find from the non-wildcards VHosts declarations, but do not find any with corresponding host name (ServerName), and so it chooses as "default" the first VHost with IP:Port, and not the first with *:Port.
To solve your problem, try to use <VirtualHost *:80> in all three vhost declarations :
<VirtualHost *:80>
DocumentRoot "c:/wamp/www/"
ServerName localhost
ServerAlias *.localhost
</VirtualHost>
<VirtualHost *:80>
DocumentRoot "c:/wamp/www/laravel/public"
ServerName laravel.dev
ServerAlias *.laravel.dev
</VirtualHost>
<VirtualHost *:80>
DocumentRoot "c:/wamp/www/learningLaravel/public"
ServerName learningLaravel.dev
ServerAlias *.learningLaravel.dev
</VirtualHost>
And reload / restart Apache.
(My only doubt about this is why Nasreddine could make a working test case with your setup.)
So I have a PHP system over an Apache Server running on a Window SO.
I want to create some kind of a mirror of it to make tests and whatever without have to copy the source code. For example: Actual scenario:
http://192.168.1.1/finantial lies on C:\EasyPHP\www\finantial
I want to create this:
http://192.168.1.1/finantial_test that points to the same source code
that the address above.
When this configs were ok, I can make the app to use different database.
on real server the configuration should be like this
test_financial.conf
<VirtualHost *:80>
DocumentRoot /var/www/financial
ServerName test.financial.com
</VirtualHost>
financial.conf
<VirtualHost *:80>
DocumentRoot /var/www/financial
ServerName financial.com
</VirtualHost>
It's so easy to do that. Just add an Alias to your VirtualHost like...
<VirtualHost *:80>
Alias /finantial_test "C:/EasyPHP/www/finantial"
</VirtualHost>
I have a Django application hosted on my main domain (example.com), and I now need to host a PHP application on a subdomain (forum.example.com).
In the directory of the main domain, I have the following .htaccess entries:
SetHandler mod_python
PythonPath "/home/.../apps/example'] + sys.path"
PythonOption mod_python.importer.path "['/home/vlive/python']+ sys.path"
PythonHandler django.core.handlers.modpython
#PythonDebug On
SetEnv DJANGO_SETTINGS_MODULE example.settings
SetEnv PYTHON_EGG_CACHE /tmp/egg-cache
At present, when I load the subdomain (forum.example.com) I still see the main site (example.com).
How can I fix this?
You need to set up your subdomains via the VirtualHost directive and only add the mod_python / mod_wsgi handler in one of the VirtualHosts.
You said you loaded the subdomain and it still shows the main site. Would you mind showing us your Apache's site configuration?
The most common reason for wrong VirtualHost being selected is a missing NameVirtualHost directive that matches host/port qualifier specified in VirtualHost directive.
What NameVirtualHost directive do you have set? What is the argument to the two VirtualHost configurations?
The general layout would be:
NameVirtualHost *:80
<VirtualHost *:80>
ServerName example.com
...
</VirtualHost>
<VirtualHost *:80>
ServerName forum.example.com
...
</VirtualHost>
These would usually be in the same file for a Linux Apache distribution though.
What have you used?
As Graham noted, most probably you have wrong VirtualHost configuration.
Double check that there is two different VH with right ServerName and that you don't use * (wildcard) in ServerName and ServerAlias that may overlap with subdomain or it goes AFTER subdomain.
Apache only search for first VH that matches, so if you have something like *.example.com above any other subdomain like forum.example.com would not work.
Also mod_wsgi is recommended by django documentation, consider switching to it.