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

Posted

技术标签:

【中文标题】使用 htaccess 检查另一个目录中的文件【英文标题】:Using htaccess to check file in another directory 【发布时间】:2011-10-02 14:25:00 【问题描述】:

好的,我开始怀疑这是否可能。我一直在阅读 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() 而杀人,

【问题讨论】:

请提供: 1) 带有您要重写的图像的示例 URL; 2) 图片的存储位置(相对于网站根目录); 3) 据我了解display.php 位于网站根目录? 4) .htaccess 文件位于您拥有所有这些规则的位置。 @LazyOne 抱歉,我以为我包含了该信息。我想我不应该在凌晨 3 点发帖。 .htaccess 和 display.php 存储在 www.website.net/mydir/img/ 中,而我需要检查的文件在 www.website.net/mydir/img/Cache/ 中。要检查和重写的示例 URL 是 www.website.net/mydir/img/66bb_1b5b6.jpg。我需要知道Cache文件夹中是否存在该文件,如果存在,则按照OP中的说明重写,如果不存在,则让服务器抛出404。 【参考方案1】:

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

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

【讨论】:

我考虑过这样做,但我希望使用 .htaccess 以便我仍然可以使用服务器 404 页面,而不必自己开发或只是有一个空白屏幕。【参考方案2】:

使用这条规则:

Options +FollowSymLinks
RewriteEngine On

RewriteCond %DOCUMENT_ROOT/mydir/img/Cache/$1.jpg -f
RewriteRule ^(.*)\.jpg$ display.php?file=$1 [L]

    这需要放到/mydir/img文件夹的.htaccess文件中

    如果您将此文件夹移动到其他位置或重命名父文件夹,您还需要在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 个 Condition .. 这使它变慢了一点(需要检查 1 个额外的正则表达式)。

【讨论】:

成功了,谢谢!那么 RewriteCond 是否从 RewriteRule 中获取了 $1 变量? RewriteCond 不先得到处理吗?这是否意味着我可以保留 URL 的 .jpg(需要允许网站将其作为图像处理)但保留实际缓存的文件具有不同的扩展名?只需更改 RewriteCond 上的扩展名就可以吗? @Sign 否,RewriteRule 需要先将第一部分与 URL 匹配,如果匹配则通过 RewriteCond。如果 ALL 匹配,则发生重写。是的,您可以保留具有不同扩展名的缓存文件。

以上是关于使用 htaccess 检查另一个目录中的文件的主要内容,如果未能解决你的问题,请参考以下文章

htaccess 和 css 文件

重定向到.htaccess中的另一个目录

将请求从一个文件夹重定向到htaccess中的另一个文件夹

.htaccess文件应该放在哪个文件夹下

将多个 php 文件视为目录,htaccess

使用 .htaccess 拒绝访问目录中的所有 PHP 文件