2012-03-16 25 views
0

nginxのX-Accel-Redirectヘッダーを使用して、特定の機密ファイルを公開ダウンロードから保護するビューがあります。私のURLは次のようになります。Django:特定のURLのAPPEND_SLASHを無効にする

url(r'^dl/f/(?P<pk>\d+)/(?P<filename>[^/]+)$', 'file_download.views.download', name='download-filename'), 

pkfilenameは、スラッシュ以外のものと一致する、ファイル名で、データベース内のファイルオブジェクトの主キーです。主に、ブラウザがファイル名を知っているので、ユーザが保存したい場合に備えています。ターミナルスラッシュはありません。

ブラウザで一致するURLを開くと、Djangoは同じURLにスラッシュを追加してリダイレクトします。ファイルはブラウザ(PDF)に表示されますが、保存する場合は、ファイル名の代わりに一般的な「download.pdf」が表示されます。

一般的なケースではAPPEND_SLASHを無効にしたくないのですが、この1つのケースで何とか回避できますか?

編集:残念ながら、Content-Disposition: attachmentヘッダーは使用できません。他のすべてのファイルもそのヘッダーなしで配信されるため、保護されたファイルと保護されていないファイルの一貫した動作が必要です。

答えて

1

私は/それはドキュメントにありますが、私はURLに拡張子を置くことは、この動作を防ぐことができますことを信じて、その代わりにsome-filename/の場合はどこ、some-filename.pdfを使用します(もちろん、それに応じてURLPATTERNを変える)知りません。

しかし、私はそれについて完全には分かりません。本当にあなたの主な問題は、ダウンロードのファイル名が正しく設定されておらず、URLをちょっと邪魔することなく修正できるということです。だけではなく、すぐにそれを返すの応答を格納し、その後、Content-Dispositionヘッダ変更:URLPATTERNが受け入れることができる

  1. :あなたのコメントの2点については

    response = HttpResponse(mimetype='application/pdf') 
    response['Content-Disposition'] = 'attachment; filename=somefilename.pdf' 
    

    UPDATE

    をワイルドカード拡張子\.\w{3,4}

  2. 「添付」はダウンロードを強制します。 'inline'を使用すると、ブラウザでファイルを読み込むことができます。ファイル名はいずれの方法でもアサートできます。

+0

私は非保護されたファイルも、それなしで提供していますので、私は、 'コンテンツDisposition'ヘッダーを使用しないことを言及している必要があり、クライアントは(当然)一貫性のある行動を望んでいます。 また、「PDF内のファイルだけでなく、すべての種類のファイルが表示されるため、「extension-in-url-pattern」は私にとってはうまく機能しません。 –

+0

?これは、クライアント(ブラウザ)にファイルをダウンロードするように通知するヘッダーです。ダウンロードを強制するのではなく、ブラウザに表示したいと言っていますか? –

+0

はい。ヘッダーがないと、ファイルタイプをサポートするブラウザは、ダウンロードする代わりに「インライン」を開きます。 ChromeのPDF私はその行動を維持したい。 'Content-Disposition'を' attachment'に設定すると、ブラウザがファイルをネイティブに表示できるかどうかに関係なく、ダウンロードダイアログが表示されます。 –

関連する問題