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

use*_*856 20 .htaccess

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

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

例如,这可以防止访问所有.JS和.SQL文件,其他文件已启用.我想要相反!我希望这些文件能够被启用,所有其他文件都要被阻止.怎么做到这一点?

SáT*_*SáT 41

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

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

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

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


还有一点解释:

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

 order allow,deny
Run Code Online (Sandbox Code Playgroud)

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

指令

 order deny,allow
Run Code Online (Sandbox Code Playgroud)

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

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

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


哦,还有一件事:一节中的指令(即<Files>和<Directory>)总是在.htaccess文件的主体之后被覆盖,覆盖它.这就是为什么Vorapsak的解决方案无法正常工作的原因:主.htaccess拒绝了请求,然后处理了<Files>订单,并允许请求.

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