To be fairly honest with you, the best approch i can see for this would be if you setup your main domain normally like this:
<VirtualHost *:80>
ServerName www.example.com
DocumentRoot /www/domain
</virtualhost>
Then you create a new virtualhost that will hold all domains you want to redirect like this:
<VirtualHost *:80>
ServerName example.com
ServerAlias foo.example.com bar.example.com others.example.com
DocumentRoot /www/redirect_folder
</virtualhost>
Inside that folder make a simple index.php page that summons the 301 so any domains hold in there will be redirect to your main domain with the 301 code.
<?
Header( "HTTP/1.1 301 Moved Permanently" );
Header( "Location: http://www.example.com" );
?>
Why do you think it is better this way ?
This way you won't have to keep updating a bunch of places everytime you have a new domain to hold and redirct to your main domain and it won't be serving your users with the current name but will actually redirect them to your main domain in question.
If you are the server owner you can make it even better, you can put the 2nd virtualhost as the first virtualhost in your httpd.conf of vhost.conf file and whenever you hit the IP of your server it will lead you to the redirection page which will lead your users to the main domain in this case instead of having to set a bunch of ServerAlias you can just create the DNS A record for that given subdomain or domain leading to your IP and the server will take care of the rest.
In this last case all you would need for your virtual host would be:
<VirtualHost *:80>
ServerName example.com
DocumentRoot /www/redirect_folder
</virtualhost>
as you dont need the ServerAlias since every and each request that hits your server IP will go to your first vhost.
In addition if you wanted to do this using .htaccess, it would be something like this i belive:
RewriteEngine on
rewritecond %{http_host} ^foo.example.com [nc]
rewriterule ^(.*)$ http://www.example.com/$1 [r=301,nc]
Your origin for the zone is .
per your configuration. You are creating records for ns1.
and ns2.
instead of ns1.example.com.
and ns2.example.com.
Since ns1.example.com
and ns2.example.com
aren't defined, they are matched by the wildcard.
EDIT: here's an edit of your config and zone:
zone "example.com." {
type master;
file "ext.zone";
};
ext.zone:
$TTL 3600
@ IN SOA ns1 root (
1 ; Serial
3600 ; Refresh
300 ; Retry
3600 ; Expire
300 ) ; Negative Cache TTL
IN NS ns1
IN NS ns2
IN A 192.0.2.6
ns1 IN A 192.0.2.4
ns2 IN A 192.0.2.5
* IN A 192.0.2.6
Everything in the zone is relative to the zone name in the named configuration, so adding a second zone just points to the same file:
zone "example.net." {
type master;
file "ext.zone";
};
Best Answer
Apache searches for a match in the order that the domains are defined.
If I understand your problem correctly then it can be solved by defining your hosts to be excluded before the catch all host.
Example: