我想知道,有没有办法阻止我的服务器上的其他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文件的执行,但不能使其无法访问,即将其作为纯文本返回?
答案 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来完成。