【问题标题】:htaccess file properly detects missing file from root directory but does not detect missing subdirectoryhtaccess 文件正确检测到根目录中丢失的文件,但未检测到丢失的子目录
【发布时间】:2011-03-14 19:13:59
【问题描述】:

我有一个 .htaccess 文件,当请求的图像不存在时,我用它来捕捉它,这样我就可以制作一个。当从 .htaccess 文件所在的目录请求时,该文件正确检测到丢失的图像。但是,如果我从技术上不存在的子目录请求图像,.htaccess 不会将我发送到我的图像处理程序。有人可以帮我匹配任何不存在的子目录吗?

这是我的 htaccess:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} .(jpg|jpeg|gif)$
RewriteRule ^(.*)$ missingimage.php?img=$1 [QSA,L]

那个 .htaccess 文件被放置在一个名为“uploads”的文件夹中。例如,我的上传文件夹也有 oranges.jpg。

以下 url 会正确地将请求传递给 missingimage.php:

http://localhost/uploads/oranges_asdf.jpg

以下网址将正确地将请求传递给missingimage.php,而是从apache返回标准404:

http://localhost/uploads/not_a_real_directory/oranges.jpg

如何修改我的 htaccess 以捕获对不存在的目录的请求并将它们传递给我的图像处理程序?谢谢你。

【问题讨论】:

    标签: .htaccess


    【解决方案1】:

    如果请求不存在,REQUEST_FILENAME 实际上并不包含完整的绝对路径。在没有真正深入研究 httpd 核心代码的情况下,我对此的理论是,它认为我们已经走得够远,知道请求实际上并不存在,所以让我们停止寻找。

    即如果您请求 /uploads/fake/test.jpg 它会 REQUEST_FILENAME 包含 /path/to/uploads/fake 并且实际上不会继续在那里附加 /test.jpg ,但是当您执行 /path/to/uploads 时会这样做/test.jpg 因为 test.jpg 是它知道请求不存在的终止。即使这不是 httpd 在那里停止字符串的原因,您也有很多其他变量可以帮助您。

    这个重写条件:

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f 
    

    现在非常流行为 MVC 框架创建调度程序的技巧并且确实有效,因为 /path/to/uplaods/fake 既不是文件也不是目录,会将您的请求发送到您的图像调度程序。

    这是您的扩展匹配条件的真正修复...您需要获取 REQUEST_URI 因为它将包含用户实际请求的内容(/uploads/fake/test.jpg),包括文件扩展名,您可以使用它您的第三个 RewriteCond 以匹配文件扩展名。由于我们要将它用于第三条规则,因此我清理了您的前两条以匹配。

    RewriteEngine On
    RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f
    RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-d
    RewriteCond %{REQUEST_URI} ^[A-Za-z0-9\/_-]+\/[A-Za-z0-9_-]+\.(jpg|jpeg|gif)$
    RewriteRule ^(.*)$ missingimage.php?img=$1 [QSA,L]
    

    我清理了您在文件名上的匹配,因为您将各种废话与实际上(当未转义时)告诉 preg 匹配引擎匹配任何内容的前导句点匹配。因此,反斜杠句点将使 preg 匹配实际句点。

    我还清理了请求 uri 上半场的匹配,以包含 /alpha/num/directories_with/underscores-and-dashes/followed/by/alpha-num_filenames.jpg|jpeg|gif,请随意删除如果你不想要的话。

    【讨论】:

    • 这太棒了。我不知道这个功能。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2017-08-24
    • 2021-10-29
    • 1970-01-01
    • 1970-01-01
    • 2012-06-26
    • 1970-01-01
    • 2011-10-14
    • 1970-01-01
    相关资源
    最近更新 更多