拒绝直接访问除index.php之外的所有.php文件

我想拒绝直接访问所有.php文件,除了一个: index.php

对其他.php文件的唯一访问应该通过php include

如果可能,我想要在同一个文件夹中的所有文件。

更新:

一个通用的规则会很好,所以我不需要通过所有的文件。 风险是我忘记了一个文件或一行。

更新2:

index.php位于一个文件夹www.myadress.com/myfolder/index.php

我想拒绝对我的文件夹和子文件夹中的所有.php文件进行访问。

在index.php中,添加一个像这样的访问值:

 $access = 'my_value'; 

在每个其他文件中,甚至在单个字节被php回显之前也要包含这个检查:

 if(empty($access)) { header("location:index.php"); die(); } 

这样,其他的PHP文件将只能通过要求/包括,而不是通过URL访问。

你确定,你想这样做吗? 即使是CSS和JS文件和图像和…?

好了,先检查一下,如果mod_access已经安装到apache,那么把下面的内容加到你的.htaccess中:

 Order Deny,Allow Deny from all Allow from 127.0.0.1 <Files /index.php> Order Allow,Deny Allow from all </Files> 

第一个指令禁止访问除localhost以外的任何文件,因为Order Deny,Allow ,Allow gets later,第二个指令只影响index.php。

警告:订单行中逗号后面没有空格。

要允许访问匹配* .css或* .js的文件,请使用以下指令:

 <FilesMatch ".*\.(css|js)$"> Order Allow,Deny Allow from all </FilesMatch> 

尽pipe如此,你不能在<Location>或者<Directory>里使用指令。

你的select是使用<FilesMatch ".*\.php$">围绕第一个允许,拒绝组,然后明确允许访问index.php。

Apache 2.4更新:这个答案对于Apache 2.2是正确的。 在Apache 2.4中, 访问控制范例已经改变,正确的语法是使用Require all denied

实际上,我是以这个主题的创造者的同一个问题来到这里的,但是没有一个解决scheme是我的问题的完整答案。 为什么只要将代码添加到服务器上的所有文件,只需configuration一次? 最接近的一个是Residuum的,但是仍然排除了所有文件,当时我只想排除没有名为index.php的php文件。

所以我想出了一个.htaccess包含这个:

 <Files *.php> Order Deny,Allow Deny from all Allow from 127.0.0.1 </Files> <Files index.php> Order Allow,Deny Allow from all </Files> 

(请记住,htaccess文件是recursion的工作,所以它完全适合问题的先决条件。)

现在我们开始。 唯一可以被用户访问的php文件将被命名为index.php。 但你仍然可以访问每个图像,CSS样式表,JS脚本等

对于这个问题的一个回答是将所有的代码写成类,除了index.php文件之外,它们是唯一的入口点。 包含类的PHP文件不会导致任何事情发生,即使它们是通过Apache直接调用的。

直接的答案是在.htaccess中包含以下内容:

 <FilesMatch "\.php$"> Order Allow,Deny Deny from all </FilesMatch> <FilesMatch "index[0-9]?\.php$"> Order Allow,Deny Allow from all </FilesMatch> 

这将允许像index.php,index2.php等任何文件被访问,但会拒绝任何其他.php文件的访问。 它不会影响其他文件types。

你可以尝试在index.php定义一个常量,并添加类似的东西

 if (!defined("YOUR_CONSTANT")) die('No direct access'); 

到其他文件的开头。

或者,您可以使用mod_rewrite并将请求redirect到index.php,像这样编辑.htaccess

 RewriteEngine on RewriteCond $1 !^(index\.php) RewriteRule ^(.*)$ /index.php/$1 [L,R=301] 

那么你应该能够分析index.php中的所有传入请求,并采取相应的措施。

如果你想省略所有的* .jpg,*。gif,* .css和* .png文件,那么你应该像这样编辑第二行:

 RewriteCond $1 !^(index\.php|*\.jpg|*\.gif|*\.css|*\.png) 

把index.php以外的所有.php文件保存在web根目录下面怎么样? 不需要任何重写规则或程序化的问题。

将include文件夹添加到包含path将有助于保持简单,不需要使用绝对path等。

可以使用URL重写来将URL映射到.php文件。 以下规则可以确定.php请求是直接创build还是被重写。 它在第一种情况下禁止请求:

 RewriteEngine On RewriteCond %{THE_REQUEST} ^.+?\ [^?]+\.php[?\ ] RewriteRule \.php$ - [F] RewriteRule test index.php 

这些规则将禁止以.php结尾的所有请求。 然而,诸如/ (它激发index.php), /test (重写为index.php)和/test?f=index.php (其中包含查询string中的index.php)的URL仍然是允许的。

THE_REQUEST包含浏览器发送到服务器的完整HTTP请求行(例如GET /index.php?foo=bar HTTP/1.1

而不是传递一个variables我做这是独立的任何网页的顶部,你不想直接访问,这应该仍然配对.htaccess的规则,但我觉得安全的,因为有一个安全的故障htaccess有时会弄得乱七八糟。

 <?php // Security check: Deny direct file access; must be loaded through index if (count(get_included_files()) == 1) { header("Location: index.php"); // Send to index die("403"); // Must include to stop PHP from continuing } ?> 

一个简单的解决scheme是将所有非index.php文件重命名为.inc,然后拒绝访问* .inc文件。 我在很多我的项目中使用它,它工作得很好。

将所有文件放在一个文件夹中。 将一个.htaccess文件放在该文件夹中,并给它的值全部拒绝。 然后在index.php放置在文件夹外面,它会根据用户input或事件回显出正确的页面

在Apache 2.4中,访问控制的语法已经改变。 如果使用如下指令:

 Order deny,allow Deny from all 

不起作用,你可能会使用Apache 2.4。

Apache 2.4文档在这里 。

您需要使用以下其中一种方法来Require all denied请求:

 # you can do it this way (with "not match") <FilesMatch ^((?!index\.php).)*$> Require all denied </FilesMatch> # or Require all denied <Files index.php> Require all granted </Files> 

只允许2个IP,所有其他将阻止

 Order Deny,Allow Deny from all Allow from 173.11.227.73 108.222.245.179 
 <Files ~ "^.*\.([Pp][Hh][Pp])"> Order allow,deny Deny from all Satisfy All </Files>