Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

subdomains #62

Open
chnak opened this issue May 13, 2024 · 11 comments
Open

subdomains #62

chnak opened this issue May 13, 2024 · 11 comments
Labels
enhancement New feature or request

Comments

@chnak
Copy link

chnak commented May 13, 2024

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

@chnak chnak added the enhancement New feature or request label May 13, 2024
@petersirka
Copy link
Collaborator

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?

@chnak
Copy link
Author

chnak commented May 14, 2024

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
Copy link
Author

chnak commented May 14, 2024

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

@petersirka
Copy link
Collaborator

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/';
});

@chnak
Copy link
Author

chnak commented May 14, 2024

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

@chnak
Copy link
Author

chnak commented May 14, 2024

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.

@petersirka
Copy link
Collaborator

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

@chnak
Copy link
Author

chnak commented May 14, 2024

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.

@petersirka
Copy link
Collaborator

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

@petersirka
Copy link
Collaborator

petersirka commented May 14, 2024

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.

@chnak
Copy link
Author

chnak commented May 15, 2024

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

2 participants