2010-08-11 62 views
0

我有这样的文件夹结构/ img/products/{product name} /然后是子文件夹hi,low和thumb。如何在htaccess中指定命名的子文件夹?

我想用htacess强制下载'hi'或'low'子文件夹中的任何文件(但不是'thumb')。

我希望像这样的工作:

<FilesMatch "\(.*)(\/hi|\/low)(.*)"> 
ForceType applicaton/octet-stream 
</FilesMatch> 

现在我不是伟大的正则表达式,但似乎在对正则表达式的路径测试工作像

/IMG公司/产品/主动/low/something.jpg

但是它不在网站上工作。

有什么建议吗?

感谢

皮特

+0

你可以显示你正在使用的确切代码作为一个起点吗? – 2010-08-11 15:44:01

+0

对不起,代码在那里,但没有标记为代码,所以没有正确显示。 – 2010-08-13 06:50:50

回答

2

这大概应该是基于我认为你正在试图做一个ServerFault问题,而是因为你确实不能做你想做什么(我认为你试图这样做),我会提供两种选择;一个可能无法工作,另一个涉及PHP脚本(对于你来说应该是没问题的,因为你的问题历史表明你之前会问一些关于PHP的问题)。

问题:

首先,我认为你正在试图做的,所以你可以纠正我,如果我错了:

# Apply ForceType to anything that's in a path that matches this 
<FilesMatch "img/products/[^/]+/(hi|low)/[^/]+$"> 
    ForceType applicaton/octet-stream 
</FilesMatch> 

然而,这是不行的,因为FilesMatch只有examines the filename,假设您可以正确放置.htaccess文件,或者将该指令与Directory语句组合在服务器或虚拟服务器配置中。但是,这是不可能的(嗯,我假设无论如何,也许你有权访问必要的配置,但由于你的问题被标记为.htaccess我猜可能不会),因为复制.htaccess文件到每个文件夹是不现实的。

的解决方案:

事实证明,mod_rewrite,在文件名分辨率的方式进行各种巫术一起,还为您提供了其他的Apache功能的扩展,你不一定会已经能够否则使用。典型的例子,我们可以使用T标志,使得最简单的解决这个设置的MIME类型:

RewriteEngine On 

# Force the MIME-type, but don't actually perform a rewrite 
RewriteRule ^img/products/[^/]+/(hi|low)/[^/]+$ - [T=application/octet-stream] 

这实际上工作得很好,但有很好的机会Apache安装认为,它比你懂得多,并在主配置中包含mimes.types文件,该文件将jpg扩展名映射到image/jpeg。此值优先于RewriteRule,因此在此情况下无效。

另一解决方案是创建一个小的脚本充当细末,经过适当的报头和图像数据从服务器到客户端。这样,你会使用mod_rewrite传递到该脚本请求:

RewriteEngine On 

# For an added bit of sanity, make the test pattern even more restrictive 
RewriteRule ^img/products/[A-Za-z._-]+/(hi|low)/[A-Za-z._-]\.[A-Za-z]+$ imageDownloader.php 

至于脚本本身,让这个答案从越来越冗长得可笑,我建议taking a look at this answerother questions on this topic之一,记住它的为了安全起见,您必须屏蔽可以下载的文件名。请注意,您将能够从$_SERVER['REQUEST_URI']获取原始请求路径,并可以使用该路径查找正确的图像。

相关问题