我编写了一个即时缩略图创建器,它通过 htaccess 文件查看请求的文件是否存在,如果不存在,则将用户发送到 php 页面来创建它。我的 htaccess 文件如下所示:
# Check the formatting (this works)
RewriteCond %{SCRIPT_FILENAME}%{QUERY_STRING} /([a-zA-Z0-9-]+).(jpg|gif|png)w=([0-9]+)&h=([0-9]+)(&c=(true|false))
# Only forward to thumbnail.php if file doesn't exist
#RewriteCond %{REQUEST_FILENAME} !-f #this works but not for the correct filename!
RewriteCond %1-%2-%3-%4-%6.jpg !-f # Doesn't work!!!
# If file doesn't exist, send here: (this works)
RewriteRule ^.*$ thumbnail.php?file_name=%1&type=%2&w=%3&h=%4&c=%6
然而,我对文件存在的检查似乎不起作用……旧版本可以使用%{REQUEST_FILENAME}
,但这不是我需要检查的正确文件名。我已验证新文件%1-%2-%3-%4-%6.jpg
具有正确的输出,但未触发条件!
根据此 URL:
this-is-the-image-name.gif?w=200&h=100&c=true
htaccess 文件应该检查此文件是否存在:
this-is-the-image-name-gif-200-100-true.jpg
缩略图和 htaccess 文件都位于同一个文件夹中,但该文件夹未知且无法进行硬编码。是否需要完整路径来检查?如果是,我如何才能获取完整路径但使用我的自定义文件名?
用这个拔掉我的头发......请帮忙!谢谢。
答案1
你完全做错了(恕我直言)。这个应该可以帮你完成工作。
RewriteCond %{QUERY_STRING} ^w=([0-9]+)&h=([0-9]+)(&c=(true|false))
RewriteCond %{DOCUMENT_ROOT}/$1-$2-%1-%2-%4.jpg !-f
RewriteRule ^([a-z0-9\-]+)\.(jpg|jpeg|gif|png)$ thumbnail.php?file_name=$1&type=$2&w=%1&h=%2&c=%4 [NC]
1) 我已经测试过并且它可以运行,但我可能遗漏了一些仅适用于您的设置/系统的东西。
2)假设缩略图(例如this-is-the-image-name-gif-200-100-true.jpg
)位于网站的根文件夹中(例如,如果网站位于,/var/www/http
则它会检查以下文件/var/www/http/this-is-the-image-name-gif-200-100-true.jpg
:)
3) 如果您的缩略图位于/thumbnails
子文件夹中,那么您需要对第 2 行和第 3 行做一些小的更改。
更新
我看到了你原来的问题:https://stackoverflow.com/questions/6302529/htaccess-cant-check-dynamic-file-existence
根据您的说明,生成的缩略图将与 thumbnail.php 一起存储在/media/thumbnails/
文件夹中。根据此信息,可以按以下方式重写规则:
RewriteCond %{QUERY_STRING} ^w=([0-9]+)&h=([0-9]+)&c=(true|false)
RewriteCond %{DOCUMENT_ROOT}/$1/$2-$3-%1-%2-%3.jpg !-f
RewriteRule ^(media/thumbnails)/([a-z0-9\-]+)\.(jpg|jpeg|gif|png)$ /$1/thumbnail.php?file_name=$2&type=$3&w=%1&h=%2&c=%3 [NC]
这些规则需要放在网站的根.htaccess文件中。
您仍然可以尝试使其独立于文件夹名称(我认为您可能需要在第一个 RewriteCondition 之后插入另一个 RewriteCondition 来检查针对 %{REQUEST_URI} 的相对路径),但如果没有准备好基础设施,我很难用虚构的文件来玩。