【问题标题】:Using htaccess to check file in another directory使用 htaccess 检查另一个目录中的文件
【发布时间】: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。

标签: php .htaccess file-exists


【解决方案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]
  1. 这需要放到/mydir/img文件夹的.htaccess文件中

  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 个 Condition .. 这使它变慢了一点(需要检查 1 个额外的正则表达式)。

【讨论】:

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