我看到几个htaccess示例禁用了一些要访问的文件:
<Files ~ "\.(js|sql)$">
order deny,allow
deny from all
</Files>
例如,这可以防止访问所有.JS和.SQL文件,其他文件已启用。我想要相反!我希望这些文件能够被启用,所有其他文件都要被阻止。怎么做到这一点?
答案 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);
?>