我想拒绝直接访问.php
除以下文件之外的所有文件:index.php
只能.php
通过php访问其他文件include
。
如果可能的话,我希望所有文件都在同一文件夹中。
更新:
一般规则会很好,所以我不需要浏览所有文件。风险是我忘记了文件或行。
更新2:
该index.php
是一个文件夹中www.myadress.com/myfolder/index.php
我想拒绝访问该文件夹中的所有.php
文件myfolder
及其子文件夹。
Answers:
您确定要这样做吗?甚至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>
第一个指令禁止访问除本地主机以外的任何文件,因为Order Deny,Allow
,稍后允许应用,第二个指令仅影响index.php。
警告:订单行中逗号后没有空格。
要允许访问与* .css或* .js匹配的文件,请使用以下指令:
<FilesMatch ".*\.(css|js)$">
Order Allow,Deny
Allow from all
</FilesMatch>
但是,您不能在.htaccess文件中<Location>
或<Directory>
内部使用指令。
您的选择是<FilesMatch ".*\.php$">
在第一个allow,deny组周围使用,然后显式允许访问index.php。
Apache 2.4的更新:
该答案对于Apache 2.2是正确的。在Apache 2.4中,访问控制范例已更改,并且使用了正确的语法Require all denied
。
实际上,我来这里时遇到的是与主题创建者相同的问题,但是给出的解决方案都不能完全解决我的问题。为什么只需将代码配置一次就可以向服务器上的所有文件添加代码?最接近的是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文件是递归工作的,因此它完全适合问题的先决条件。)
现在我们开始。用户可以访问的唯一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文件的任何形式的访问。它不会影响其他文件类型。
您可以尝试在中定义常量index.php
并添加类似
if (!defined("YOUR_CONSTANT")) die('No direct access');
到其他文件的开头。
或者,您可以使用mod_rewrite
请求并将其重定向到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)
.htaccess: RewriteRule: unknown flag 'L][R'
如何将除index.php之外的所有.php文件保留在Web根上方?无需任何重写规则或程序性错误。
然后将include-folder添加到include路径将有助于使事情简单,无需使用绝对路径等。
include('file.php')
toinclude('myfolder/file.php')
ini_set('include_path', ini_get('include_pat'). ':/path/to/files');
)中,那么您可以做同样的事情而不会破坏任何内容。
URL重写可用于将URL映射到.php文件。以下规则可以确定.php请求是直接发出还是被重写。在第一种情况下,它禁止请求:
RewriteEngine On
RewriteCond %{THE_REQUEST} ^.+?\ [^?]+\.php[?\ ]
RewriteRule \.php$ - [F]
RewriteRule test index.php
这些规则将禁止所有以结尾的请求.php
。但是,仍允许使用诸如/
(将触发index.php),/test
(将其重写为index.php)和/test?f=index.php
(在querystring中包含index.php)之类的URL。
THE_REQUEST
包含浏览器发送到服务器的完整HTTP请求行(例如,GET /index.php?foo=bar HTTP/1.1
)
与其传递变量而不是在不希望直接访问的任何页面顶部包含独立变量,我仍然应该将其与.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
}
?>
在Apache 2.4中,访问控制的语法已更改。如果使用如下指令:
Order deny,allow
Deny from all
不起作用,您可能正在使用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>