htaccess允许通过扩展名访问文件?

时间:2011-10-16 21:52:43

标签: .htaccess

我看到几个htaccess示例禁用了一些要访问的文件:

<Files ~ "\.(js|sql)$">
   order deny,allow
   deny from all
</Files>
例如,这可以防止访问所有.JS和.SQL文件,其他文件已启用。我想要相反!我希望这些文件能够被启用,所有其他文件都要被阻止。怎么做到这一点?

3 个答案:

答案 0 :(得分:40)

Vorapsak的答案几乎是正确的。它实际上是

order allow,deny
<Files ~ "\.(js|sql)$">
   allow from all
</Files>

您需要顶部的订单指令(并且您不需要任何其他内容)。

有趣的是,似乎我们不能仅仅否定FilesMatch中的正则表达式,这很奇怪,特别是因为“!”没有服务器错误或任何东西。好吧,呃。


和一点解释:

订单原因告诉服务器其预期的默认行为。

 order allow,deny

告诉服务器首先处理“allow”指令:如果请求与任何allow指令匹配,则将其标记为okay。然后对“拒绝”指令进行评估:如果请求与任何拒绝指令匹配,则拒绝该指令(如果在第一次传递中允许则无关紧要)。如果未找到匹配项,则拒绝该文件。

指令

 order deny,allow

以相反的方式工作:首先服务器处理“拒绝”指令:如果请求匹配,则标记为拒绝。然后评估“allow”指令:如果请求与allow指令匹配,则允许进入,即使它与之前的deny指令匹配。如果请求不匹配,则允许该文件。

在这种特定情况下,服务器首先尝试匹配allow指令:它看到允许js和sql文件,因此对foo.js的请求通过;对bar.php的请求不匹配任何指令,因此被拒绝。

如果我们将指令交换为“order deny,allow”,那么foo.js将通过(作为js),bar.php也将通过,因为它不匹配任何模式。


哦,还有一件事:部分中的指令(即&lt; Files&gt;和&lt;目录&gt;)总是在之后 的主体。 htaccess文件,覆盖它。这就是为什么Vorapsak的解决方案没有按照惯例工作的原因:主要的.htaccess拒绝了请求,然后&lt;文件&GT;订单已处理,并允许请求。

Htaccess是最糟糕的魔力,但它有逻辑。

答案 1 :(得分:0)

您是否尝试过设置

deny from all

标签之外(之前),然后更改

deny from all

allow from all

内?像

这样的东西
deny from all
<Files ~ "\.(js|sql)$">
   order allow,deny
   allow from all
</Files>

答案 2 :(得分:0)

您可以将文件权限更改为&#34; 600&#34;,这样您就可以通过脚本访问它,并且会拒绝直接访问。

<?php
   // Read and write for owner, nothing for everybody else
   chmod("/somedir/somefile", 0600);
?>

http://php.net/manual/en/function.chmod.php