我需要通过密码保护服务器上的所有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可能有一些配置设置?
P.S。我注意到一个可能的答案的一个线索:如果我在重写规则中用“asdf”替换“images”并尝试不存在的路径,它会重定向到download.php。但是,如果我使用“images”尝试不存在的路径,则返回404错误。服务器上不存在Asdf,但图像 - 是一个真正的文件夹。
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.
P.P.S。过了一段时间后,我发现在/ 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>
可能是重写问题的原因。
P.P.P.S。
将重写规则写入文件夹/ 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>
答案 0 :(得分:1)
如果由于RewriteCond%{REQUEST_FILENAME} -f指令而存在于路径中,PDF将开始下载。这告诉apache该文件存在并且不继续执行以下规则。如果删除此行,则无论文件是否存在,mod_rewrite都将始终遵循规则。