web-dev-qa-db-ja.com

D7にアップグレードするときに/ system / files参照を処理する方法

drush site-upgradeを使用してサイトをD6からD7に移行した後、D6バージョンの一部のパブリックコンテンツが、より効率的な/system/files/logo.pngではなく、インスタンス/sites/default/files/logo.pngなどのURIを含む画像を参照していることに気付きました
ディスク上にはsystemディレクトリがなく、URLの書き換えも見られないため、最初のフォームはルーティングのためにDrupal)になると思います。

問題は、D7のアップグレード後に、そのような参照が「ページが見つかりません」エラーにつながり、画像が破損することです。

テストとして、somefile.png/sites/default/files/にドロップすると、D6は喜んでサービスします http://example.com/system/files/somefile.png ファイルがデータベースのどこにも知られていません。しかし、D7は明らかにそれを行いません。

/system/filesは、D7ではなくD6に対して何かを意味するハードコードされたパスコンポーネントですか? /admin/config/media/file-systemでは、ダウンロード方法は「公開ローカルファイル...」に設定されています。

Drupal 7でこれを解決する方法?どこかに欠けている構成設定がありますか?

4
Daniel Vérité

なぜそれが起こるのか

D6では、systemモジュールは、_system/files_を_file_download_コールバックに関連付ける次のメニューエントリを提供します。

system_menu()関数内:

_  $items['system/files'] = array(
    'title' => 'File download',
    'page callback' => 'file_download',
    'access callback' => TRUE,
    'type' => MENU_CALLBACK,
  );
_

次に、file_download(),で、ファイルが存在し、ダウンロードするhook_file_download()オブジェクトがない場合、ファイルが提供されます。

一方、D7はページ引数をprivateに設定して展開します。

_  $items['system/files'] = array(
    'title' => 'File download',
    'page callback' => 'file_download',
    'page arguments' => array('private'),
    'access callback' => TRUE,
    'type' => MENU_CALLBACK,
  );
_

これは、_private://_スキームをファイル名の前に付加する効果があります。これは、_file_download_が登録されたファイルストリームラッパーを要求して処理します。
デフォルトでは(_/admin/config/media/file-system_にプライベートパスが設定されていない)、このスキームは登録されていません。そのため、_GET /system/files/logo.png_は最終的に404ステータスで失敗します。

直し方

プライベートファイルシステムパスを_sites/default/files_(パブリックパスと同じ)に設定すると、機能します。

ただし、Drupalを介してパブリック静的ファイルをルーティングすることは、httpdによる直接アクセスよりもはるかに重いため、サイトで必要な場合に実際のプライベートスペースを使用できなくなるため、長期的な修正としては適切ではありません。それは将来的に。

長期的な修正は、これらの_/system/files/xyz_参照を探し、それらを_/sites/default/files/xyz_に置き換えることです。

1
Daniel Vérité