将php文件作为纯文本返回,但索引除外

时间:2014-09-03 15:09:18

标签: php apache

我想知道,有没有办法阻止我的服务器上的其他php文件的执行,除了根文件夹中的index.php,我将所有调用重定向到此文件

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^.*$ index.php [L,NS]

我不清楚那些-d-f-l单独做什么,我所知道的是他们允许返回图像和内容等文件,而不是将地址重写为index.php也是如此。不好的是,它们也允许执行site.com/somescript.php之类的地址。

我想知道是否可以禁用根文件夹中任何其他php文件的执行,但不能使其无法访问,即将其作为纯文本返回?

2 个答案:

答案 0 :(得分:1)

只需创建另一个重写规则,禁止以.php结尾的任何请求,但/index.php除外:

RewriteCond %{REQUEST_URI} !^/index.php$
RewriteRule \.php$ - [R=403,L,NC]

或者,如果您希望以纯文本形式提供其他.php个文件:

<FilesMatch "\.php$">
    RemoveHandler .php
    php_flag engine off
</FilesMatch>
<Files index.php>
    AddHandler php5-script .php
    php_flag engine on
</Files>

答案 1 :(得分:0)

此问题的典型解决方案是将所有PHP代码(index.php除外)移到DOCUMENT_ROOT目录之外,以便Apache无法看到它们。例如,您现在拥有:

/path/to/site.com
    index.php
    other1.php
    other2.php

理想情况下,您需要以下内容:

/path/to/site.com/public
    index.php

/path/to/site.com/lib
    other1.php
    other2.php

然后在Apache配置中,指向/path/to/site.com/public而不是/path/to/site.com。这样,您的库文件对Apache不可见,无法直接请求。请注意,这可能需要更改一些代码,因为现在您的包已经移动了,但这可以通过更改include_path来完成。