You need at least two server blocks, and nginx will select a more specific server block to process the request. See this document for more details.
You will need a server block for xyz.example.com , for example:
server { listen 80; server_name xyz.example.com; location / { proxy_pass http://$1.foo.com; } }
Then either a default_server or a wild card server, for example:
server { listen 80; server_name *.example.com; return http://foo.com/; }
Or:
server { listen 80 default_server; return http://foo.com/; }
source share