现有文件的Apache重写规则不起作用

时间:2013-10-30 10:49:32

标签: mod-rewrite

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

1 个答案:

答案 0 :(得分:1)

如果由于RewriteCond%{REQUEST_FILENAME} -f指令而存在于路径中,PDF将开始下载。这告诉apache该文件存在并且不继续执行以下规则。如果删除此行,则无论文件是否存在,mod_rewrite都将始终遵循规则。