Files
frankenphp/docs/ja/x-sendfile.md
demouth 53e6d1897d docs: add Japanese translation for documentation (#1740)
* docs(ja): add Japanese documentation translation

* docs(ja): fix invalid link fragments and improve section heading
2025-08-25 16:15:10 +02:00

2.8 KiB
Raw Permalink Blame History

大きな静的ファイルを効率的に配信する X-Sendfile/X-Accel-Redirect

通常、静的ファイルはウェブサーバーによって直接配信されますが、 時にはファイルを送信する前にPHPコードを実行する必要があります。 例えば、アクセス制御、統計、カスタムHTTPヘッダーなど

残念ながら、PHPを使用して大きな静的ファイルを配信することは、 ウェブサーバーを直接使うより非効率的です(メモリ過負荷、パフォーマンス低下など)。

FrankenPHPでは、カスタマイズされたPHPコードを実行したに、 静的ファイルの送信をウェブサーバーに委譲できます。

この機能を使うには、PHPアプリケーションは提供するファイルのパスを含む カスタムHTTPヘッダーを定義するだけです。残りの処理はFrankenPHPが行います。

この機能は、Apacheでは X-Sendfile 、NGINXでは X-Accel-Redirect として知られています。

以下の例では、プロジェクトのドキュメントルートがpublic/ディレクトリであり、 public/ディレクトリの外部に保存されたファイルを private-files/ディレクトリからPHPで提供したいと仮定します。

設定方法

まず、この機能を有効にするために以下の設定をCaddyfileに追加します:

	root public/
	# ...

+	# Symfony や Laravel など、Symfony HttpFoundation コンポーネントを使用するプロジェクトに必要
+	request_header X-Sendfile-Type x-accel-redirect
+	request_header X-Accel-Mapping ../private-files=/private-files
+
+	intercept {
+		@accel header X-Accel-Redirect *
+		handle_response @accel {
+			root private-files/
+			rewrite * {resp.header.X-Accel-Redirect}
+			method * GET
+
+			# セキュリティ強化のため、 PHP によって設定された X-Accel-Redirect ヘッダーを削除
+			header -X-Accel-Redirect
+
+			file_server
+		}
+	}

	php_server

プレーンなPHPの場合

private-files/からの相対パスをX-Accel-Redirectヘッダーの値として設定します:

header('X-Accel-Redirect: file.txt');

Symfony HttpFoundationコンポーネントを使用するプロジェクトの場合Symfony、Laravel、Drupalなど

SymfonyのHttpFoundationはこの機能をネイティブサポートしており、 X-Accel-Redirectヘッダーの正しい値を自動的に決定してレスポンスに追加します。

use Symfony\Component\HttpFoundation\BinaryFileResponse;

BinaryFileResponse::trustXSendfileTypeHeader();
$response = new BinaryFileResponse(__DIR__.'/../private-files/file.txt');

// ...