基于原始REQUEST_FILENAME字符串处理的备用文件名的Apache RewriteCond

时间:2018-08-16 10:33:58

标签: apache mod-rewrite

我有一个应用程序,它以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>的一部分进行测试。

有可能吗?

0 个答案:

没有答案