RewriteCond根本不起作用,如果文件存在则不能正确检查

时间:2010-05-12 18:19:32

标签: apache .htaccess mod-rewrite watermark

我一直试图解决这个问题几个小时,但什么都没有。

在.htaccess内部,每当有人从我网站的文件夹中请求图像时,我都会尝试检查另一个文件夹中是否存在同名文件;如果是,返回该文件;如果没有,请返回最初请求的文件。

看起来很容易,但它根本行不通。 .htaccess代码如下:

RewriteEngine On

RewriteCond /images/blog/watermark/$1 -f
RewriteRule ^(.*) /images/blog/watermark/$1

“RewriteCond”始终返回负数,因此请求的图像始终按原样加载。如果我将其更改为,

RewriteCond %{REQUEST_FILENAME} -f

它总是返回正数,所以它从我想要的文件夹中获取图像 - 除非图像不存在,产生错误,这正是我想要阻止的。

我做错了什么?

感谢。

2 个答案:

答案 0 :(得分:1)

RewriteCond的语法错误。你可能想做更像这样的事情:

RewriteCond ^/images/blog/watermark/(.*) -f

在这种情况下,$1实际上并不存在,因为RewriteCond采用正则表达式,而不是替换字符串。因此,Apache正在寻找/images/blog/watermark/$1而不是/images/blog/watermark/内的任何文件。

供参考:http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html#RewriteCond

答案 1 :(得分:1)

我明白了!

显然RewriteCond需要整个目录结构来正确检查文件是否存在。

我在之前在RewriteCond中使用的路径之前添加了%{DOCUMENT_ROOT}并且它有效。

此外,在进一步阅读文档之后,我注意到第一组是$ 0而不是$ 1,从RewriteRule反向引用。

所以最终的代码如下:

RewriteEngine On 

RewriteCond %{DOCUMENT_ROOT}/images/blog/watermark/$0 -f 
RewriteRule ^(.*) /images/blog/watermark/$1