0

サーバー上のすべての PDF ファイルをパスワードで保護する必要があります。PDF への一般的なパスは /images/a/a2/some.pdf です。

httpd.conf の私の書き換えコードは次のとおりです。

RewriteEngine On
Options FollowSymLinks
RewriteCond %{REQUEST_FILENAME} -f 
RewriteRule ^images/([^/]*)/([^/]*)/([^/]*)^.pdf$ /download.php?file=$3& [L]
RewriteRule images/a/a2/VB-VB-41-445%29_Small.pdf$ /download.php?file=ok [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ /index.php/$1 [L,QSA]

5行目は、正規表現に問題がないかを確認するために追加されています。

残念ながら、リダイレクトは機能しません。pdf が存在する場合は、すぐに読み込みを開始します。ただし、パスが存在しない場合は機能します。逆の結果が必要です。コードの何が問題なのですか、それとも mod_rewrite の構成設定がいくつかあるのでしょうか?

PS 考えられる答えの手がかりに気づきました。書き換えルールで「画像」を「asdf」に置き換えて、存在しないパスを試すと、download.php にリダイレクトされます。しかし、「画像」で存在しないパスを試してみると、404 エラーが返されます。Asdf はサーバー上に存在しませんが、images は真のフォルダーです。

RewriteRule /images/asd.pdf /download.php?file=ok [L,QSA] - doesn't work, folder exists, file asd.pdf doesn't exist
RewriteRule /asdf/asd.pdf /download.php?file=ok [L,QSA] - works, redirects correctly to download.pdf, path doesn't exists (neither folder nor file)
RewriteRule images/a/a2/VB.pdf$ /download.php?file=ok [L] - doesn't work, redirect doesn't happen, instead an existing pdf file starts to download.

PPS しばらくして、 /images/ フォルダー内に次のテキストを含む .htaccess ファイルがあることがわかりました。

# Protect against bug 28235
<IfModule rewrite_module>
RewriteEngine On
RewriteCond %{QUERY_STRING} \.[^\\/:*?\x22<>|%]+(#|\?|$) [nocase]
RewriteRule . - [forbidden]
</IfModule>
<IfModule expires_module>
   ExpiresActive On
   ExpiresDefault "access plus 1 month"
</IfModule>

おそらく、それが書き換えの問題の原因です。

PPPS

この問題は、フォルダー /images/ 内のファイル .htaccess に書き換えルールを記述することで解決されました。

# Protect against bug 28235
<IfModule rewrite_module>
RewriteEngine On
RewriteCond %{QUERY_STRING} \.[^\\/:*?\x22<>|%]+(#|\?|$) [nocase]
RewriteRule . - [forbidden]
RewriteRule ^[^\/]+/[^\/]+/(.*)\.pdf$ ../download.php?file=$1& [L] 
</IfModule>
<IfModule expires_module>
   ExpiresActive On
   ExpiresDefault "access plus 1 month"
</IfModule>
4

1 に答える 1