使用htaccess检查另一个目录中的文件


Using htaccess to check file in another directory

好吧,我开始怀疑这是否可能。我一直在阅读htaccess教程和示例,但我似乎就是无法让它正常工作。

我有一个脚本,创建动态图像运行在一个目录上的朋友网站。我可以访问/,但我使用的实际目录是在/mydir/。为了显示图像,它们通过PHP输出到png。我有以下RewriteRule设置来获取所请求的文件名并运行PHP脚本。每个文件名代表一个单独的文件,其中包含一个序列化对象,用于display.php脚本

RewriteRule ^(.*)'.jpg$ display.php?file=$1

这部分工作得很好,但是如果有人请求一个不存在的文件,它只会抛出PHP错误,因为脚本被调用,但没有对象供它使用。

我现在要做的,完全失败,是让它检查文件是否存在于。/Cache/目录,然后像往常一样运行脚本,如果不是,那么服务器可以抛出一个标准的404。

我试过

RewriteCond %{REQUEST_URI} ^(.*)'.jpg$
RewriteCond %{DOCUMENT ROOT}/img/Cache/%1.jpg -f

和其他REQUEST_URI, REQUEST_URL, SCRIPT_FILENAME, SCRIPT_NAME等的组合。我似乎不能拿出适当的变量和正则表达式来处理这个问题,所以我向你们寻求帮助。最大的问题是不知道每个变量的实际情况,所以我可以看到我错在哪里。我想使用var_dump()

使用此规则:

Options +FollowSymLinks
RewriteEngine On
RewriteCond %{DOCUMENT_ROOT}/mydir/img/Cache/$1.jpg -f
RewriteRule ^(.*)'.jpg$ display.php?file=$1 [L]
  1. 这需要放在。htaccess文件在/mydir/img文件夹

  2. 如果您将此文件夹移动到其他地方或重命名父文件夹,您将需要更新RewriteCond


如果你愿意,你可以尝试这种方法,这是更灵活的(不需要指定父文件夹名称),但我不能保证这将在您的设置工作(但它确实在我的PC上工作):

Options +FollowSymLinks
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} ^(.*)/([^/]+)'.jpg$
RewriteCond %1/Cache/%2.jpg -f
RewriteRule ^(.*)'.jpg display.php?file=$1 [L]

这里当前的物理文件夹是根据请求的URL自动确定的。但是,如果您有符号链接或其他一些设置,它可能会产生不正确的结果。+ . .它还有一个条件…这使得它有点慢(1个额外的regex检查)。

我将使用PHP文件来检查它:

使用file_exists在您的PHP,如果它不存在,使用header("HTTP/1.0 404 Not Found");header('Location的404图像