如果URL的一部分指向现有文件,RewriteCond会给出误报

时间:2014-09-22 12:25:40

标签: apache .htaccess mod-rewrite

我设置.htaccess文件来路由我的网站请求:

Options -Multiviews

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php [L] 

现有文件(如图像)的请求正常处理,其他文件转发到路由器。这很好。

我正在尝试使用以下类型的网址来查看缩略图:

http://www.example.com/images/image.png/thumbnail-big/

我的想法是http://www.example.com/images/image.png是一个有效的网址,并指向一个文件,但缩略图变体不是有效的网址(因为/thumbnail-big/部分),并由路由器(如果需要,会生成缩略图)。

但这不起作用。处理缩略图URL就好像指向现有文件一样,并且跳过路由器的RewriteRule,但它不是实际文件,因此服务器显示通用404错误。换句话说,"是这条路径的现有文件"对于缩略图URL,条件显然评估为true,即使它不是现有文件。它几乎就像只评估image.png之前的部分一样。

有没有办法检查文件是否存在以至于我没有得到这种误报?

1 个答案:

答案 0 :(得分:0)

将您的条件和规则更改为:

Options -Multiviews

RewriteEngine On
RewriteCond %{DOCUMENT_ROOT}/$0 !-f
RewriteCond %{DOCUMENT_ROOT}/$0 !-d
RewriteRule .* index.php [L]

使用%{REQUEST_FILENAME}有时会误导为Apache内部生成文件名的方式。在您的情况下,它正在检查文件,地址为:http://www.example.com/images/image.png