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”替换“images”并尝试不存在的路径,它会重定向到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>

可能是重写问题的原因。

购买力平价

通过在文件夹 /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

1

The PDF starts to download if exists in path because of RewriteCond %{REQUEST_FILENAME} -f directive. This tells apache that the file exists and to not proceed with the following rules. If you remove this line, the mod_rewrite will always follow rules no matter if file exists or not.

于 2013-10-30T12:15:48.300 回答