.htaccess允许访问一个文件和一个文件夹

时间:2012-08-31 07:38:51

标签: apache .htaccess

我的文件夹结构看起来像这样。

-beta
   +folder1
   +folder2
   +folder3
   file1.php
   file2.php

现在我想限制所有文件和文件夹,但不限制folder2和file2.php 我怎么能写我的.htaccess来做这件事。这就是我写的。

Options +FollowSymlinks
RewriteEngine on
RewriteCond %{REQUEST_URI} !/folder2%$
RewriteCond %{REQUEST_URI} !/file2.php
RewriteRule $ /beta/file2.php [R=302,L]

不知何故,上述方法在一个系统中有效,但在其他系统中无效。你能指出我在这里做错了吗?

谢谢,

萨哈

2 个答案:

答案 0 :(得分:3)

尝试更改规则,以便让2个文件夹通过,然后将所有内容重定向到file2:

Options +FollowSymlinks
RewriteEngine on
RewriteBase /beta/
RewriteRule ^file2\.php - [L]
RewriteRule ^folder2 - [L]
RewriteRule ^ file2.php [L,R=302]

您获得的错误可能来自您所处的%

如果您想彻底禁止访问其他任何内容,可以将最后一条规则更改为:

RewriteRule ^ - [L,F]

  

如果您不介意,请解释每一行吗?

RewriteBase指令允许重写引擎知道相对路径的URI基础为/beta/。因此,所有不以/开头的文件/路径名都会自动拥有该基础。

接下来的两个规则只是匹配URI并使用-字符进行“传递”,这意味着“不做任何事”。因此,当您请求/folder2/file2.php时,重写引擎不执行任何操作,并让请求通过,就好像什么都没发生一样。但是如果请求是其他任何内容,前两个规则将不匹配,最后一个规则将匹配,因为正则表达式是^,它匹配所有内容。该规则的目标将所有内容重定向到/beta/file2.php(因为基础)。

方括号中带有F标志的禁止规则是相同的,如果请求不是针对folder2或file2.php,那么该规则将匹配它(^)并且它通过它传递(-),但是F标志使它返回“403 Forbidden”而不是满足请求的任何目的。

答案 1 :(得分:0)

使用REQUEST_FILENAME代替REQUEST_URI我希望这会有所帮助

Options +FollowSymlinks
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !/folder2
RewriteCond %{REQUEST_FILENAME} !/file2.php
RewriteRule $ /file2.php [R=302,L]