Apache 如果URL的一部分指向现有文件,则RewriteCond将给出假阳性

Apache 如果URL的一部分指向现有文件,则RewriteCond将给出假阳性,apache,.htaccess,mod-rewrite,Apache,.htaccess,Mod Rewrite,我设置了一个.htaccess文件来路由我的站点的请求: Options -Multiviews RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . index.php [L] 对现有文件(如图像)的请求正常处理,其他文件则转发到路由器。这个很好用 我正在尝试使用以下类型的URL查看缩略图: http://www.example.com/

我设置了一个.htaccess文件来路由我的站点的请求:

Options -Multiviews

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php [L] 
对现有文件(如图像)的请求正常处理,其他文件则转发到路由器。这个很好用

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

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

但这不起作用。缩略图URL被当作指向现有文件处理,路由器的重写规则被跳过,但它不是实际文件,因此服务器显示一个一般404错误。换句话说,对于缩略图URL,“此路径是否为现有文件”条件的计算结果显然为true,即使它不是现有文件。这几乎就像只对
image.png
之前的部分进行评估一样


有没有办法检查该文件是否存在,这样我就不会得到误报?

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

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