Skip to content

Angular 17 SSR baseHref / baseUrl is not respected #27356

@JustDoItSascha

Description

@JustDoItSascha

Which @angular/* package(s) are the source of the bug?

platform-server

Is this a regression?

Yes

Description

Maybe I'm stupid or don't see something, but I think there is something wrong. I want to deploy an angular ssr app under a subpath of a domain, for example https://example.org/myapp. This subpath is handled by an nginx reverse proxy. So far so good.

Now I'm adding baseHref to the angular.json. It gets added to the index.html, everything fine. But if I'm looking to the server.ts I see the following:

server.get('*.*', express.static(browserDistFolder, {
        maxAge: '1y',
    }));

server.get('*', (req, res, next) => {
        const { protocol, originalUrl, baseUrl, headers } = req;

        commonEngine
            .render({
                bootstrap,
                documentFilePath: indexHtml,
                url: `${protocol}://${headers.host}${originalUrl}`,
                publicPath: browserDistFolder,
                providers: [{ provide: APP_BASE_HREF, useValue: baseUrl }],
            })
            .then((html) => res.send(html))
            .catch((err) => next(err));
    });

But the baseUrl is always empty. Because the baseUrl can only be set if the code would look like this:

const router = express.Router();

router.get('*.*', express.static(browserDistFolder, {
        maxAge: '1y',
    }));

router.get('*', (req, res, next) => {
        const { protocol, originalUrl, baseUrl, headers } = req;

        commonEngine
            .render({
                bootstrap,
                documentFilePath: indexHtml,
                url: `${protocol}://${headers.host}${originalUrl}`,
                publicPath: browserDistFolder,
                providers: [{ provide: APP_BASE_HREF, useValue: baseUrl }],
            })
            .then((html) => res.send(html))
            .catch((err) => next(err));
    });

server.use('/myapp', router);

Without using .use() the baseUrl MUST be empty. So I don't understand the whole purpose behind the default code? And of course it's not working with the default code, otherwise I wouldn't write.

So it looks like this scenario is not possible without changing the server.ts fundamentally. And it would be nice, if this changes are described in the docs.

Or if they were the default and changes to the baseHref option in the angular.json would also affect the server.ts. That I don't have to change the server.use() part manually.

Please provide a link to a minimal reproduction of the bug

No response

Please provide the exception or error you saw

No response

Please provide the environment you discovered this bug in (run ng version)

Angular 17.3.1

Anything else?

No response

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions