framework4 icon indicating copy to clipboard operation
framework4 copied to clipboard

subdomains

Open chnak opened this issue 1 year ago • 11 comments

Hello, how to dynamically link to different subdomains, I can't find any way to achieve it

chnak avatar May 13 '24 08:05 chnak

We disabled subdomain routing because it was useless and not used in 99.99% of cases. Every request contains a hostname, so depending on the hostname, you can archive a subdomain name (but you can't affect routing). What do you need it for, in particular?

petersirka avatar May 13 '24 21:05 petersirka

How can I dynamically determine subdomains and then route to different routes? image I change the URL in the middleware, but it does not route to the corresponding router.

chnak avatar May 14 '24 02:05 chnak

I need different subdomains to link to different routes, but it seems this can't be achieved in Total4?

chnak avatar May 14 '24 03:05 chnak

Hmm. I'm looking at the source code, and maybe it works with subdomain routing. I'm not sure if this works.

// Route with flags
ROUTE('[eshop,store]/', action);
// e.g. http://eshop.totaljs.com/
// e.g. http://store.totaljs.com/

ROUTE('[*]/', action);
// All subdomains

ROUTE('[nice*]/', action);
// All subdomains which contain `nice` word

We removed this functionality in Total.js v5. If the above solution will not work, then you can try something like this:

ON('request', function(req) {
    // This property is used for routing:
    // req.uri.pathname = '/home/';
});

petersirka avatar May 14 '24 06:05 petersirka

I'll give it a try, thank you very much.

chnak avatar May 14 '24 08:05 chnak

Hmm. I'm looking at the source code, and maybe it works with subdomain routing. I'm not sure if this works.

// Route with flags
ROUTE('[eshop,store]/', action);
// e.g. http://eshop.totaljs.com/
// e.g. http://store.totaljs.com/

ROUTE('[*]/', action);
// All subdomains

ROUTE('[nice*]/', action);
// All subdomains which contain `nice` word

We removed this functionality in Total.js v5. If the above solution will not work, then you can try something like this:

ON('request', function(req) {
    // This property is used for routing:
    // req.uri.pathname = '/home/';
});

I also looked at the source code. This only exists in the v3 version. It seems that v4 does not support such usage.

chnak avatar May 14 '24 08:05 chnak

Although it lacks documentation, we implemented it for backward compatibility with Total.js v3. I hope it works: https://github.com/totaljs/framework4/blob/master/index.js#L3925

petersirka avatar May 14 '24 08:05 petersirka

ROUTE('GET /', function(){this.json('index')});
ROUTE('GET [admin]/', function(){this.json('admin')});
ROUTE('GET [foliko]/', function(){this.json('foliko')});

I tried this method, but it doesn't seem to work. I really can't find a solution, so I have no choice but to split the service into two and control it with nginx.

chnak avatar May 14 '24 09:05 chnak

I'll test it today and I'll try to fix it.

petersirka avatar May 14 '24 09:05 petersirka

I have looked at it and it's not implemented in the routing mechanism. I have checked possible implementation and it's really complicated. Maybe you can try something like this:

exports.install = function() {
    
    ROUTE('GET /', subdomain({
        admin: funtion() {
            this.json('admin');
        },
        foliko: funtion() {
            this.json('foliko');
        }
    }));

};

function subdomain(map) {
    return function() {
        var self = this;
        var subdomain = self.subdomain ? self.subdomain.join('.') : null;

        if (subdomain) {
            for (var key in map) {
                if (subdomain === key) {
                    map[key].apply(self, arguments);
                    return;
                }
            }
        }

        self.invalid(404);
    };
}

The controller.subdomain property returns a parsed subdomain. Therefore, you can use this property in the controller's action to determine the subdomain name.

petersirka avatar May 14 '24 12:05 petersirka

Okay, thank you very much, I'll give it a try

chnak avatar May 15 '24 01:05 chnak