2013-04-06 50 views
2

我有一个文件夹包含各种.php文件,我想阻止直接访问它们,但是index.php。发送访问被拒绝在apache上使用htaccess的错误,除了某个文件的所有文件

这是我到目前为止,它似乎工作:

<IfModule mod_rewrite.c> 
RewriteEngine on 
RewriteCond $1 !^(index\.php) 
RewriteRule ^(.*)$ /403.php/$1 [R=403] 
</IfModule> 

这是做了正确的方法是什么?另外请注意,403.php文件夹中的文件实际上并不存在。

编辑:为了更好地阐明我正在做的事 - 我有一个包含index.php文件的文件夹(我们可以假设名为“includes”),以及index.php包含的各种其他文件。

我不希望用户/恶意机器人/谁能够直接访问index.php以外的“includes”中的任何内容。

如果他们到达其他任何地方(无论文件是否存在),我想向浏览器发送403-拒绝访问的HTTP响应代码。

回答

2

正确的方法是使用F标志,它只是返回一个403禁止的,你可以使用-作为只是意味着目标“什么也不做,让URI穿过不变”:

RewriteEngine on 
RewriteCond $1 !^(index\.php) 
RewriteRule ^(.*)$ - [L,F] 

或者,您可以尝试将条件与规则结合使用:

RewriteEngine on 
RewriteRule !index\.php$ - [L,F] 
+0

谢谢!你的重写规则'RewriteRule ^(。*)$ - [L,F]'是绝对要走的路,更短,肯定比以前更正确。 – adriano72 2013-04-06 22:59:39

1

您可以创建错误页面。实际上,一些控制面板有一个应用程序,允许用户使用.shtml文件扩展名创建启用了SSI的403 (禁止)页面。在cPanel那个应用程序。有“错误页面”其中发现“高级”部分,并且403页面将保存在403.shtml基地名称。如果您没有找到这样的应用程序,则只有在您的服务器配置为允许此项时,才可以手动创建启用了SSI的HTML文件。如果这是不可能的,你仍然可以使用另一个扩展。

所以,比较正确的做法是重新映射存在的错误页面,比如像这样:

RewriteCond %{REQUEST_URI} !^/index\.php 
RewriteRule ^(.*) /403.shtml 

但无论如何,你想干什么?

相关问题