.htaccess - 限制对文件的访问,除非被服务器访问

.htaccess - Limit access to files unless accessed by server

我正在为我的服务器寻求有关 .htaccess 重写规则的帮助。

考虑到我有以下结构:

index.html
foo.html
private\
        bar.js
        secret.txt
public\
       helloworld.js
       cat.jpg

我需要满足以下条件:

  1. 导航到 http://example.comhttp://example.com/index.htmlhttp://example.com/foo.htmlhttp://example.com/foo 的用户应该能够顺利加载。
  2. 导航到 http://example.com/private/bar.jshttp://example.com/private/secret.txt 的用户以及此文件夹中的任何其他文件都应该得到 403 禁止,尽管这些文件应该能够被 html 文件访问使用它。
  3. 导航至 http://example.com/public/ 的用户应该能够访问其中的任何内容。

最后一点只是为了让我了解如何在需要时否定规则。我设法通过阻止文件到达某个地方,除非它们是 .html 但是当扩展名被省略并且它非常混乱时它不起作用所以我希望一些专业人士可以帮助我以一种干净的方式这样做。

编辑:阐明要求 #2 以将所有文件包含在私人文件夹中

根据您显示的示例,您能否尝试以下操作。请确保在测试 URL 之前清除浏览器缓存。基本上是第二个条件。无论如何,您的第三个条件不需要任何规则(考虑到根据第三个条件,您没有 public 文件夹的任何其他规则)。

RewriteEngine ON
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^private/(bar\.js|secret\.txt)/?$ - [R=403,L]


第二个解决方案: 确保一次仅使用以上或以下规则,以下认为您只想允许http://example.com, index.html, foo.html OR foo 根据您的第一个条件设置 URL 并阻止其他 URL,如果是这种情况,则可以尝试关注。

RewriteEngine ON
##In case you want to forbid anything apart from:
##http://example.com, index.html, foo.html OR foo then following.
RewriteCond ^(index\.html|foo\.html|foo)/?$ [NC]
RewriteRule ^ - [R=403,L]

##For forbidding private/bar.js and private/secret.txt here.
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^private/(bar\.js|secret\.txt)/?$ - [R=403,L]