Concrete CMSで「PDFを別名URLで公開する」方法 (ファイル差し替えに強い固定URLの作り方)

2026/04/16
Concrete CMS で PDF を公開する際、ファイルを差し替えると URL が変わってしまう問題があります。
この方法では、application/bootstrap/app.php に独自ルートを追加し、任意の固定URL(例:/guidelines)で PDF を配信できます。
PDF を差し替えても URL は変わらず、ダウンロード時のファイル名も自由に設定できます。
「常に最新の PDF を同じ URL で公開したい」場合に最適な手法です。

Concrete CMS で PDF を公開するとき、次のような悩みはありませんか。

  • PDF の URL を固定したい
  • ファイルマネージャーで PDF を差し替えても URL を変えたくない
  • /download_file/1234/abcd... のような長い URL を使いたくない
  • ダウンロード時のファイル名を任意の日本語にしたい

これらは Concrete CMS 標準機能だけでは実現が難しい 場面があります。

そこで今回は、
application/bootstrap/app.php に独自ルートを追加して、
任意の URL で PDF を配信する方法

を紹介します。

この方法でできること

  • URL を自由に決められる
    例:/guidelines
  • PDF を差し替えても URL は変わらない
  • ダウンロード時のファイル名を日本語で指定できる
  • download_file のような複雑な URL を使わなくてよい

Concrete CMS の運用でよくある
「PDF の最新版を常に同じ URL で公開したい」
というニーズに最適です。


実現方法:独自ルートで PDF を返す

Concrete CMS では、
application/bootstrap/app.php にルートを追加することで、
任意の URL に対して任意の処理を割り当てられます。

以下が完成形のコードです。

<?php
use Concrete\Core\Support\Facade\Application;
use Concrete\Core\Routing\Router;
use Concrete\Core\File\File;
use Symfony\Component\HttpFoundation\Response;

$app = Application::getFacadeApplication();
$router = $app->make(Router::class);

// 例: https://example.com/guidelines でアクセス可能
$router->get('/guidelines', function() {

    // FileID 415 の PDF を取得
    $file = File::getByID(415);

    if (!$file) {
        return "File not found";
    }

    // 承認済みバージョンを取得
    $fv = $file->getApprovedVersion();
    $resource = $fv->getFileResource();

    // PDF の中身を読み込む
    $content = $resource->read();

    // PDF をブラウザに返す(ファイル名も指定可能)
    return new Response(
        $content,
        200,
        [
            'Content-Type' => 'application/pdf',
            'Content-Disposition' => 'inline; filename="実施要綱.pdf"'
        ]
    );
});

コードのポイント解説

/guidelines という URL を作成

$router->get('/guidelines', function() {

ここを変更すれば、
/rules/pdf/latest など自由に設定できます。

② FileID で PDF を指定

$file = File::getByID(415);

ファイルマネージャーで PDF を差し替えても
FileID が変わらない限り URL は固定です。

③ 承認済みバージョンを取得

$fv = $file->getApprovedVersion();

Concrete CMS の「承認済み」機能に対応。

④ PDF をレスポンスとして返す

return new Response($content, 200, [...]);

Content-Dispositioninline にするとブラウザ表示、
attachment にすると強制ダウンロードになります。

⑤ ダウンロード時のファイル名を指定

filename="実施要綱.pdf"

日本語ファイル名も問題なく使えます。