为什么我们应该将index.php保存在公用文件夹而不是根目录中?

时间:2015-04-01 17:44:33

标签: php apache .htaccess symfony zend-framework

我仍然不太明白为什么我们必须将index.php保存在公共目录而不是根目录中。

root/of/project
    public/
       index.php
       .htacess
       (html, image, css, etc)

然后,在我们的虚拟主机文件中写下以下内容:

DocumentRoot /path/to/myapp/app/public
<Directory "/path/to/myapp/app/public">
  # other setting here
</Directory>

然后.htaccess文件将所有不存在的URL重定向到index.php:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [QSA,L]

我注意到大多数框架都是这样做的,例如Symfony和Zend,就像this教程一样。通过修改虚拟主机文件的麻烦,实际的好处实际上是什么?

为什么我们不应该在下面而不是修改虚拟主机文件?是安全隐患还是什么?

root/of/project    
    index.php
    .htacess
    public/ 
       (html, image, css, etc)

如果保留index.php并修改虚拟主机文件更好,那么我们可以如何修改实时服务器中的虚拟主机文件?假设我有这个域名http://my-website.com/,我在浏览器上访问它,我首先看到的不是网页而是下面的目录,直到我点击公共目录然后我看到主页,

root/of/project
    public/
       index.php
       .htacess
       (html, image, css, etc)

我认为Zend或Symfony项目也是如此,但是无法修改实时服务器中的虚拟主机文件。我不擅长这些框架,如果我将Zend项目上传到实时服务器,我将在下面看到,

enter image description here

那么,如何将Zend或Symfony项目部署到您的实时服务器以立即查看您的网页?

1 个答案:

答案 0 :(得分:6)

将项目根目录中的index.php 保留在之外是一个非常好的主意,原因很简单:

您不希望您的用户访问公共文件夹(index.php,css,js等)中的任何文件。当你将index.php放在根文件夹中时,你也可以访问composer.json文件,例如这是一个安全风险 - 潜在的黑客会知道你使用的是什么软件包,哪个版本对他来说更容易进行攻击。

说到你的托管 - 你的根目录下应该有一个public_html文件夹,它应该是你Symfony应用程序的公共文件夹(web),你也应该能够保留公用文件夹之外的文件。如果你不这样做 - 你真的需要考虑改变托管合作伙伴

修改: 回答你的评论。假设您的托管中有public_html个文件夹,并且您希望部署Symfony应用,该应用应该可以直接在http://your-domain.com上访问。然后你应该将整个Symfony项目放在任何地方(但在public_html文件夹之外),并使public_html文件夹成为web项目的Symfony文件夹的符号链接。此操作相当于编辑虚拟主机并更改DocumentRoot,我认为这是您无法做到的。

您还可以在另一个问题上查看我的answer以获得更多说明