我有一个应用程序,它以details
作为文档根目录,并由作曲者将代码和模块放在site/public
中。
默认情况下,图片在site/vendors
中,显示为site/public/images/<file>
我想要实现的是请求静态文件(例如图像或javascript),例如http://<host>/images/<file>
,以实际从http://<host>/images/<module>/<path>
获取文件。
现在,我知道我无法使用重写规则将请求重定向到文档根目录之外,因此我使用site/vendors/<module>/images/<path>
将适当的请求重定向到site/public/.htaccess
,这样将处理该位。
site/public/vendorModulesStaticLookup.php
vendorModulesStaticLookup.php本质上在哪里(我跳过了所有的健全性测试)
RewriteCond %{REQUEST_URI} ^/(images|javascript)/.*
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(images|javascript)/([^/]+)/(.*)$ vendorModulesStaticLookup.php?type=$1&module=$2&path=$3 [NC,L]
这可行,但是,如果指定的路径无效,并且<?php
$targetFile = "site/vendor/$module/$type/$path";
$mimetype = mime_content_type($targetFile);
if (!empty($mimetype)) {
header("Content-Type: $mimetype");
}
header("Content-Length: ".filesize($targetFile));
$retval = @readfile($targetFile);
if ($retval === FALSE) {
$lastError = error_get_last();
$errorMessage = @$lastError['message'];
error_log(__FILE__.':'.__LINE__." Something went wrong attempting to readfile($targetFile): ".$errorMessage);
}
?>
不存在,它将返回空白页,而不是我漂亮的404页(在$targetFile
的其他位置通过RewriteCond!-f
所以我想做的是制定一条.htaccess
规则,该规则在我执行RewriteCond
之前先测试文件site/vendors/<module>/<type>/<path>
是否存在,这样不好的请求就不会发送到{ {1}}首先。
在上面的示例中,RewriteRule
将是vendorModulesStaticLookup.php
或%{REQUEST_FILENAME}
,具体取决于它是生产还是开发中的,所以我要做的就是能够完全操纵{{1 }},然后再作为/var/www/html/site/<path>
的一部分进行测试。
有可能吗?