【Angular/SSRでSEO対策】Angular/SSRサイトのURL変更時に役立つ301リダイレクト設定


※ 当ページには【広告/PR】を含む場合があります。
2025/07/14
【Angular基礎講座】Signals徹底解説!リアクティブな状態管理の新しい波に乗ろう
蛸壺の技術ブログ|Angular/SSRサイトのURL変更時に役立つ301リダイレクト設定



Angular/SSRで構築されたブログサイトを運営していると、記事の統廃合やURL構造の変更といった運用上のニーズが出てくることがあります。 特に、古い記事のURLから新しい記事のURLへ恒久的に誘導したい場合、SEO評価を維持するためには「301リダイレクト」の実装が不可欠です。
Angular/SSRはサーバーサイドレンダリング(SSR)を実現するためにExpress.jsを内部で利用しています。 そのため、サーバー側でのリダイレクト処理を実装するには、Express.jsのルーティングとミドルウェアの理解が重要になります。
この記事では、301リダイレクトの基本から、Express.jsでの実装、そしてAngular/SSRの
server.ts に組み込む具体的な方法までを、コード例を交えながら解説していきます。


合同会社タコスキングダム|蛸壺の技術ブログ【効果的学習法レポート・2025年最新】Angular(JSフレームワーク)をこれから学びたい人のためのオススメ書籍&教材特集

301リダイレクトとは?その重要性とSEOへの影響



301リダイレクトは、ウェブページが恒久的に新しいURLへ移動したことをブラウザや検索エンジンに伝えるためのHTTPステータスコードです。 この「恒久的」という点が非常に重要で、一時的な移動を示す302リダイレクトとは区別されます。

301リダイレクトのメリット

            1.  **SEO評価の引き継ぎ**:
    検索エンジンは301リダイレクトを「ページの永続的な移動」と認識し、
    古いURLが持っていたSEO上の評価(PageRankやリンクジュースなど)を新しいURLへ引き継ぎます。
    これにより、URL変更による検索順位の低下リスクを最小限に抑えることができます。
2.  **ユーザーエクスペリエンスの向上**:
    古いURLにアクセスしたユーザーを自動的に新しいURLへ誘導するため、
    リンク切れによる不満を防ぎ、スムーズなブラウジング体験を提供します。
3.  **クローラビリティの最適化**:
    検索エンジンのクローラーは、301リダイレクトを検出すると、
    新しいURLをインデックスの対象として認識し、効率的にサイトをクロールできるようになります。

        

ブログ記事のURLを変更したり、複数の記事を統合して新しい記事を作成したりする際には、必ず301リダイレクトを設定し、SEO資産を失わないようにすることが肝心です。


合同会社タコスキングダム|蛸壺の技術ブログ【効果的学習法レポート・2025年最新】Angular(JSフレームワーク)をこれから学びたい人のためのオススメ書籍&教材特集

Express.jsにおける301リダイレクトの基本的な実装



Angular/SSRのバックエンドで動作するExpress.jsでは、非常にシンプルに301リダイレクトを設定することができます。 Express.jsの
res.redirect() メソッドを使用し、第一引数にHTTPステータスコード(301)、第二引数にリダイレクト先のURLを指定します。
まずはAngularの話は抜きにして、Express.js単独で使う場合の301リダイレクトの基本実装を示します。

            import express from 'express';
const app = express();

//古いパスへのアクセスを新しいパスへ301リダイレクト
app.get('/old-article-path', (req, res) => {
    res.redirect(301, '/new-article-path');
});

//パラメータを含むパスのリダイレクトしたい場合
app.get('/old-category/:id', (req, res) => {
    const id = req.params.id;
    res.redirect(301, `/new-category/${id}`);
});

const PORT = process.env.PORT || 4321;
app.listen(PORT, () => {
    console.log(`Node Express server listening on http://localhost:${PORT}`);
});

        

上記のコードでは、
/old-article-path へのGETリクエストがあった場合に、ブラウザに対して /new-article-path へ恒久的に移動するよう指示しています。 URLパラメータを含むパスのリダイレクトも同様です。


合同会社タコスキングダム|蛸壺の技術ブログ【効果的学習法レポート・2025年最新】Angular(JSフレームワーク)をこれから学びたい人のためのオススメ書籍&教材特集

Angular/SSRの`server.ts`での実装



では本題の話です。
Angular/SSRアプリケーションでは、
server.ts ファイルがExpress.jsサーバーの設定と起動を担っています。 このファイル内で、先ほどのExpress.jsのリダイレクトロジックを組み込むことで、サーバーサイドでの301リダイレクトを実現します。

server.ts の典型的な構造では、静的ファイルの配信やAngularアプリケーションのレンダリングを行う前に、カスタムのリダイレクトルールを設定するのが一般的です。 これにより、リダイレクトルールが他のルーティングよりも優先的に処理されます。
以下に、
server.ts に301リダイレクトを追加する具体的なコード例を示します。

            import { createNodeRequestHandler } from '@angular/ssr/node';
import express from 'express';
import asyncify from 'express-asyncify';
import { fileURLToPath } from 'node:url';
import { dirname, resolve } from 'node:path';

export function app(): express.Express {
    const server = asyncify(express());
    const serverDistFolder = dirname(fileURLToPath(import.meta.url));
    const browserDistFolder = resolve(serverDistFolder, '../browser');

    /** 👇 ここから301リダイレクトのルールを追加 */

    //1. 古い記事のパスを新しいパスへリダイレクトする例
    server.get('/old-blog-post-1', (req, res) => {
        res.redirect(301, '/new-blog-post-a');
    });

    //2. 正規表現を使ってパターンマッチングでまとめてリダイレクトする例
    //   ... /legacy/ から始まる全てのパスを /archive/ へリダイレクト
    server.get('/legacy/*', (req, res) => {
        const newPath = req.originalUrl.replace('/legacy/', '/archive/');
        res.redirect(301, newPath);
    });

    /** 👆 ここまで */

    //静的ファイル(browserフォルダ以下)を提供
    server.get('**',
        static_(distFolderRaw, {
            maxAge: '1y'
        })
    );

    //SSRエンジンから定義済みルートをレンダリング
    server.get('*', async (req, res, next) => {
        const _req = createWebRequestFromNodeRequest(req);
        const _res = await angularAppEngine.handle(_req);
        if (_res) {
            writeResponseToNodeResponse(_res, res);
        } else {
            next()
        }
    });

    return server;
}

const server = app();
//RequestHandlerをエクスポート
export const reqHandler = createNodeRequestHandler(server);

        

ここでの実装のポイントは以下の通りです。

            *   **リダイレクトルールの配置**:
    `server.get('*.*', express.static(...))` のような静的ファイル配信のルーティングや、
    `server.get('*', ...)` のようなAngularアプリケーションのレンダリングを行う
    ルーティングよりも前にリダイレクトルールを記述することが重要です。
    これにより、リダイレクトが優先的に処理され、不要なファイル検索や
    Angularアプリケーションの起動を防ぐことができます。
*   **正規表現の活用**:
    特定のパターンに合致するURLをまとめてリダイレクトしたい場合は、
    Express.jsのルーティングで正規表現を利用すると便利です。
    上記の例では、`/legacy/`から始まる全てのパスを`/archive/`にリダイレクトする例を示しています。
*   **テスト**:
    リダイレクト設定後は、必ずブラウザや`curl`コマンドなどで実際にアクセスしてみて、
    期待通りに301リダイレクトが行われるか、そして新しいURLに正しく遷移するかを確認しましょう。

        

AngularではCSR/SSR/SSGでリダイレクトの実装は異なる



Angularのルーティングの仕組みを考慮して、リダイレクトの方法を適切に選択する必要があります。

参考|サーバーとハイブリッドレンダリング
            * CSR(クライアントサイドレンダリング):
    ルート設定(app.routes.tsなど)で、
    redirectToプロパティで指定されたルートへリダイレクト先を指定

* SSR(サーバーサイドレンダリング):
    サーバーサイドのプロセス内(server.tsなど)で、
    標準的なHTTPメソッドからリダイレクト(301/302...)を実行する

* SSG(プリレンダリング):
    プリレンダリングされたHTML内の <meta http-equiv="refresh"> タグを使用した
    「ソフトリダイレクト」を利用する

        


現状、ルーティングのさせ方が異なるため、プログラミングする人間にとって混乱をきたしやすいかもしれません。
思うようなリダイレクトになっていない場合、この辺を良く配慮すると良いでしょう。


合同会社タコスキングダム|蛸壺の技術ブログ【効果的学習法レポート・2025年最新】Angular(JSフレームワーク)をこれから学びたい人のためのオススメ書籍&教材特集

まとめ



この記事では、Angular/SSRでブログサイトを運用する際に不可欠となる301リダイレクトの実装方法について解説しました。

            *   301リダイレクトは、ページの恒久的な移動を検索エンジンに伝え、
    SEO評価を引き継ぐために非常に重要
*   Angular/SSRのサーバーサイドはExpress.jsで構築されているため、
    Express.jsの`res.redirect(301, 'URL')`メソッドを利用
*   `server.ts`ファイル内で、静的ファイル配信やAngularアプリケーションの
    レンダリングを行うルーティングよりも前にリダイレクトルールを記述することで、
    効率的かつ確実にリダイレクトを処理される

        

これで、古くなった記事へのアクセスがあってもSEO評価への影響を最小限に抑えながら、サイトの高品質化の作業に集中することができるでしょう。 ぜひ、あなたのAngular/SSRプロジェクトに301リダイレクトを導入してみてください。

記事を書いた人

記事の担当:taconocat

ナンデモ系エンジニア

主にAngularでフロントエンド開発することが多いです。 開発環境はLinuxメインで進めているので、シェルコマンドも多用しております。 コツコツとプログラミングするのが好きな人間です。

合同会社タコスキングダム|蛸壺の技術ブログ【効果的学習法レポート・2025年最新】Angular(JSフレームワーク)をこれから学びたい人のためのオススメ書籍&教材特集