Nginx: Forward all Subdomains
5,845
Solution 1
This worked for me:
# rules
server {
#general
listen 80;
# add www.
if ($host ~ ^(?!www)) {
rewrite ^/(.*)$ http://www.$host/$1 permanent;
}
# remove subdomain
if ($host ~ "^www\.(.*?)\.(.{3,}\.([a-z]{2}\.[a-z]{2}|[a-z]{2,4}))$") {
set $host_without_sub $2;
rewrite ^/(.*)$ http://www.$host_without_sub/$1 permanent;
}
Solution 2
Your original configuration is not taking advantage of the nginx configuration. With a rewrite like that nginx will have to do extensive parsing on each request. If you are in an environment where performance and quick response time is essential then you'll want to use server blocks.
# Add www and redirect subdomains.
server {
listen 80;
server_name domain.com *.domain.com;
rewrite ^ http://www.domain.com$request_uri permanent;
}
This way there is no complex parsing, Nginx uses a hash table for the server lookups and the rewrite uses the already parsed $request_uri variable.
Solution 3
I'm not sure why you have two versions. Here's what I have in my config. it removes www.
from the start of any domain:
server {
# omitting listen/server_name/access_log/error_log
if ($host ~* www\.(.*)) {
set $wwwless $1;
rewrite ^(.*)$ $scheme://$wwwless$1 permanent;
}
# locations, other rules, etc
}
Author by
mgutt
Updated on September 17, 2022Comments
-
mgutt almost 2 years
My code doesn't work with second level tld's like domain.co.uk
Here is my conf:
# add www. if ($host ~ ^(?!www)) { rewrite ^/(.*)$ http://www.$host/$1 permanent; } # remove subdomain if ($host ~ "^www\.(.*)\.(.*\.([a-z]{2,4}|[a-z]{2}\.[a-z]{2}))") { set $host_without_sub $2; rewrite ^/(.*)$ http://www.$host_without_sub/$1 permanent; }
-
mgutt about 14 years"why you have two versions" Because you don't understand my question. They are completly different rewrites (add www, remove subdomains).