web-dev-qa-db-ja.com

「public」で始まらないファイル名を持つすべてのPDFファイルをホームページにリダイレクトするにはどうすればよいですか?

ファイル名の先頭にpublic-プレフィックスが付いているファイル(たとえば、public-samplepdf.pdf)を除くすべてのPDFファイルへの直接アクセスを無効にして、パブリックで表示できるようにします。 。他のすべてのPDFファイルをホームページにリダイレクトしたいのですが。

これは私が試した.htaccessコードですが、動作していません。代わりに何をすべきですか?

RewriteRule ^(.+/)?public-(.*) /redirect-url/ [R=301,L]
4
Dherell
RewriteRule ^(.+/)?public-(.*) /redirect-url/ [R=301,L]

これは、あなたがやろうとしていることの反対の(ある種の)ことをするように思われるでしょう。文字列「public-」を含むのURLをリダイレクトします。 not最後のパスセグメントで「public-」を開始し、.pdfで終わるURLに一致する必要があります。

また、これは301(永続的な)リダイレクトであってはなりません。そうしないと、以前にこれらのURLにアクセスしてリダイレクトされたユーザーは、許可されたときにURLにアクセスするのが困難になります(ただし、以下の注を参照してください)[* 1])。

Mod_rewriteで正規表現に!を前置するだけで、正規表現をnegateできます。したがって、!fooは、「foo」を含まないURLと一致します。

代わりに、すべての非パブリック.pdfファイルをホームページにリダイレクトするには、次を試してください。

RewriteRule !^(.+/)?public-[\w-]\.pdf$ / [R,L]

これにより、指定されたパターンに一致しないすべてのURLが無条件にリダイレクトされます。文字クラス[\w-]は、文字a-zA-Z0-9_、および-と一致します。したがって、PDFファイル名には英数字とアンダースコアおよびハイフンのみが許可されます。

実際のファイルにマップするリクエストのみをリダイレクトする必要がある場合は、追加の条件が必要です(これらのディレクティブをファイルの先頭に配置する場合)。例えば:

RewriteCond %{REQUEST_FILENAME} -f
RewriteRule !^(.+/)?public-[\w-]\.pdf$ / [R,L]

または、これらのディレクティブをWordPressフロントコントローラーの後に配置します。

一部のファイルは公開されていますが、それらのファイルにはアクセスできません。 ただし、ログインしたときにすべてのファイルにアクセス可能

[* 1] あなたが無条件に.htaccessでこれらすべてのリクエストをリダイレクトしているときに、それをどのように実装したいのか私にはわかりませんが?


ちょっとしたことですが、...通常、ホームページにリダイレクトしてリクエストを「ブロック」するべきではありません。また、mod_rewriteを使用して、ファイルシステム上の特定のファイルへのアクセスをブロックすることもありません。 .htaccessのmod_rewriteは、ファイルシステムのパスではなく、主にURLを扱います。

具体的にblock.pdfファイルへのアクセス(つまり、403 Forbiddenに対応)するが、public-.pdfを許可するファイルを作成したら、<FilesMatch>コンテナ内でmod_authz_core(Apache 2.4+)を使用します。例えば:

<FilesMatch "^(?!public-).+\.pdf$">
Require all denied
</FilesMatch>

上記の正規表現は、ネガティブ先読みを使用して、「public-」で始まらないすべての.pdfファイルに一致します。

3
MrWhite