Concrete CMSで「PDFを別名URLで公開する」方法 (ファイル差し替えに強い固定URLの作り方)
2026/04/16
Concrete CMS で PDF を公開する際、ファイルを差し替えると URL が変わってしまう問題があります。
この方法では、application/bootstrap/app.php に独自ルートを追加し、任意の固定URL(例:/guidelines)で PDF を配信できます。
PDF を差し替えても URL は変わらず、ダウンロード時のファイル名も自由に設定できます。
「常に最新の 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-Disposition を inline にするとブラウザ表示、
attachment にすると強制ダウンロードになります。
⑤ ダウンロード時のファイル名を指定
filename="実施要綱.pdf"
日本語ファイル名も問題なく使えます。


