Gatsby JS - разрешить URL страниц с суффиксом «. html» и без него - PullRequest
1 голос
/ 26 мая 2020

Я нахожусь в немного неудачном положении, когда выбор дизайна кого-то лет go теперь влияет на мою реконструкцию веб-сайта. По сути, еще когда сайт был изначально создан, дизайнер настаивал на том, чтобы все URL-адреса были полностью явными с расширениями. html (например, website.com/index.html). В настоящее время я нахожусь в процессе перестройки сайта с помощью Gatsby, и мое внимание пришло к выводу, что нам необходимо продолжить разрешение этих старых URL-адресов, поскольку они все еще разбросаны по inte rnet в виде ссылок. Но владелец хотел бы отойти от этих URL-адресов в будущем, поэтому в основном мне просто нужно поддерживать их разрешение для обратной совместимости.

Я работал с функцией onCreatePage и могу заставить ее разрешить. html ссылки вроде этого:

exports.onCreatePage = async ({ page, actions }) => {
    const { createPage } = actions;
    console.log(actions);

    // Create resolvers for all pages with .html in URLs
    if (!page.path.endsWith(".html")) {
        const isIndex = page.path === "/";
        page.matchPath = isIndex
            ? page.path + "/index.html"
            : page.path.replace(/\/$/, ".html");

        createPage(page);
    }
};

Но, к сожалению, это разрешает только URL-адреса. html, а не простые URL-адреса без суффикса html.

Есть ли способ, которым я могу добиться этого? Должен ли я искать другой API, чем onCreatePage?

UPDATE: Только что нашел gatsby-plugin-client-side-redirect и попробовал следующее:

exports.onCreatePage = async ({ page, actions }) => {
    const { createRedirect } = actions;

    // Create resolvers for all pages with .html in URLs
    if (!page.path.endsWith(".html")) {
        const isIndex = page.path === "/";
        const legacyUrl = isIndex
            ? page.path + "/index.html"
            : page.path.replace(/\/$/, ".html");

        console.log("legacyUrl::", legacyUrl);
        createRedirect({ fromPath: legacyUrl, toPath: page.path, isPermanent: true });
    }
};

Консоль выводит правильные старые URL-адреса, но не перенаправляет ... не уверен, что я делаю не так ...

1 Ответ

2 голосов
/ 26 мая 2020

createRedirect работает, просто не работает при работе сайта в режиме разработки. Вам необходимо выполнить полную сборку и обслуживать локально, если вы хотите наблюдать, как перенаправления работают правильно локально.

Окончательный код был:

exports.onCreatePage = async ({ page, actions }) => {
    const { createRedirect } = actions;

    // Create resolvers for all pages with .html in URLs
    if (!page.path.endsWith(".html")) {
        const isIndex = page.path === "/";
        const legacyUrl = isIndex
            ? "/index.html"
            : page.path.replace(/\/$/, ".html");

        createRedirect({
            fromPath: legacyUrl,
            toPath: page.path,
            isPermanent: true
        });
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...