我需要通过密码保护服务器上的所有 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>