Page 1 of 1

Nginx get domainname without TLD or suffix

Posted: Thu Oct 27, 2022 9:47 pm
by sparkzara
Hi,
I am trying to add reverse proxy template to show content from a subdomain based on domainname.
For ex: example.com should show content from example.maindomain.com

I tried to use %domain%, but it gets full name including TLD value like example.com.maindomain.com

Is there any nginx variable or code available to get only domain name without domain suffix or TLD?

Re: Nginx get domainname without TLD or suffix

Posted: Thu Oct 27, 2022 10:13 pm
by myVesta
Nope.
You can only make it static string in tpl file, if you need it only for one domain?

Other possibility is to make yourtemplate.sh that alter apache/nginx config files, something like this - http://dl.myvestacp.com/vesta/vesta-cp- ... forward.sh

Code: Select all

file=/home/$user/conf/web/$domain.nginx.conf
if [ -f "$file" ]; then
    sed -i "s/FORWARDTO/$FORWARDTO/g" $file
fi

Re: Nginx get domainname without TLD or suffix

Posted: Fri Nov 04, 2022 4:17 pm
by sparkzara
hi, thanks for the reply.
but i wanted this to be applied for all the domain added on myvestacp using a specific template.
Note: i'm doing domain addition through api.

but here is the list of things i did so far.
created 2 files on /usr/local/vesta/data/templates/web/nginx/
1. reverse-force-https.tpl ( clone of force-https.tpl ) - no changes done.
2. reverse-force-https.stpl - clone of force-https.stpl and added proxy_header addition.

here is the code of reverse-force.stpl

Code: Select all

server {
    listen      %ip%:%proxy_ssl_port% ssl http2;
    server_name %domain_idn% %alias_idn%;

    ssl_certificate      %ssl_pem%;
    ssl_certificate_key  %ssl_key%;
    error_log  /var/log/%web_system%/domains/%domain%.error.log error;

    location / {
        proxy_pass      https://%ip%:%web_ssl_port%;
        proxy_set_header Host %domain%.actor.com;
        location ~* ^.+\.(%proxy_extentions%)$ {
            root           %sdocroot%;
            access_log     /var/log/%web_system%/domains/%domain%.log combined;
            access_log     /var/log/%web_system%/domains/%domain%.bytes bytes;
            expires        max;
            # try_files      $uri @fallback;
        }
    }

    location /error/ {
        alias   %home%/%user%/web/%domain%/document_errors/;
    }

    location @fallback {
        proxy_pass      https://%ip%:%web_ssl_port%;
    }

    location ~ /\.ht    {return 404;}
    location ~ /\.env   {return 404;}
    location ~ /\.svn/  {return 404;}
    location ~ /\.git/  {return 404;}
    location ~ /\.hg/   {return 404;}
    location ~ /\.bzr/  {return 404;}

    disable_symlinks if_not_owner from=%docroot%;

    include %home%/%user%/conf/web/*nginx.%domain_idn%.conf_letsencrypt;
    include %home%/%user%/conf/web/s%proxy_system%.%domain%.conf*;
}
on location / , i'am added proxy_header
proxy_set_header Host %domain%.actor.com;

but after adding domain i was expecting a value of domain name without suffix on web config generated,
so if i add testing.com domain, the proxy header should be
proxy_set_header Host testing.actor.com;
but what i get is
proxy_set_header Host testing.com.actor.com;

do we have something like php explode %domain% and get first array value.
so i can simply replace %domain% with that ?

Thanks.

Re: Nginx get domainname without TLD or suffix

Posted: Sat Dec 30, 2023 9:04 pm
by sparkzara
hi. any update on this.
i hope many developers will be looking for similar solution for SaSS product hosted on single domain and served to individual users by subdomains, and when end user requires custom domain to show content from a sub-domain this workaround is required.

based on some solutions i tried below steps.

1.
add map function on /etc/nginx/nginx.conf inside http block
Screenshot 2023-12-31 012342.png
Screenshot 2023-12-31 012342.png (20.84 KiB)

Code: Select all

map $domain $domain_without_tld {
    ~^(?<domain_name>[^.]+)\..+$ $domain_name;
}
when i do this, i get $domain undefined variable error. without $ symbol, there is no error, but again it doesnt seems to be working.

2.
added proxy pass on forcessl.tpl file at /usr/local/vesta/data/templates/web/nginx/force-https.stpl
Screenshot 2023-12-31 013023.png
Screenshot 2023-12-31 013023.png (54.76 KiB)

Code: Select all

location / {
        proxy_pass      https://%ip%:%web_ssl_port%;
        proxy_set_header Host $domain_without_tld.%domain_idn%;
        location ~* ^.+\.(%proxy_extentions%)$ {
            root           %sdocroot%;
            access_log     /var/log/%web_system%/domains/%domain%.log combined;
            access_log     /var/log/%web_system%/domains/%domain%.bytes bytes;
            expires        max;
            # try_files      $uri @fallback;
        }
    }
I need to use map function to get value of domain withoud tld on tpl file.
can you please help me with a solution for this?