【问题标题】:Is it good practice to make system root unable to be accessed?使系统根无法访问是一种好习惯吗?
【发布时间】:2011-11-12 18:29:12
【问题描述】:

假设我们有以下架构:

root/
    application/
        -public/
            index.php
            css/
            img/
            javascript/
        ...
    system/
        ...

我在想,如果我使用以下规则在根目录中创建一个 .htaccess 文件:

RewriteEngine On
RewriteRule \.(css|jpe?g|gif|png|js|ico)$ - [L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ application/public/index.php?url=$1 [QSA,L]

我将能够使除 public 以外的其他文件夹无法访问。假设 index.php 是加载应用程序需要的所有文件并包含并需要它们的文件(不经意间使用相对路径):应用程序实际上是在 index.php 中运行的,并且每个公共文件(如 css 样式表、图像或 javascript 脚本)都是在公用文件夹中。因此,作为用户,您无法访问系统文件夹,因为如果您输入 www.site.com/,它指的是 root/application/public/。我说的对吗?

但是我在那里设置的 htaccess 规则不起作用...如果我将该 htaccess 放在根文件夹中并尝试访问根文件夹,浏览器会显示根文件夹的文件列表(应用程序和系统)。为什么它不起作用?

我之前在 index.php 位于根文件夹时使用过这个:

RewriteEngine On
RewriteRule \.(css|jpe?g|gif|png|js|ico)$ - [L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]

它工作得很好。为什么新的不起作用?

【问题讨论】:

    标签: php apache .htaccess


    【解决方案1】:

    您项目的文档根目录应设置为/public 文件夹。

    这样,这是网络用户可以访问的唯一文件夹。

    编辑:有关更多信息,请查看 apache 手册http://httpd.apache.org/docs/2.0/mod/core.html#documentroot

    【讨论】:

    • 如果我之前或之后添加“DocumentRoot application/public/”,它会返回“Server Error”。
    • DocumentRoot 应该是绝对路径。 IE。公共文件夹的完整路径。
    • 但我不知道该文件的最终客户端路径在哪里。我只知道会有一个 application/ 和一个 application/public/ 文件夹。没有别的了。
    • 对不起。谈到 .htaccess 真的让我很紧张。我从来没有理解过那个文件,但我真的需要它。请在所有条件下写下 .htaccess 文件,知道 application/public/ 应该是网站的根目录并且 index.php URI 应该附加到 index.php?url=(here) ...?跨度>
    • @Charliepiga:您不能从.htaccess 文件设置 DocumentRoot。您必须在 httpd.conf / httpd-vhosts.conf 中进行设置。
    【解决方案2】:

    我的初始代码是正确的。除了第三行不经意地考虑了 / 一个文件夹并让我看到它而不是重定向到 application/public/。 评论第三行一切正常。

    RewriteEngine On
    RewriteRule \.(css|jpe?g|gif|png|js|ico)$ - [L]
    #RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ application/public/index.php?url=$1 [QSA,L]
    

    【讨论】:

    • 您仍然不应该通过 .htaccess 执行此操作。它会在每个请求时重新加载。您应该将这些指令放在虚拟主机定义中。
    • @meagar 怎么样?在哪里?这会损害某人的应用程序还是只是减慢它的速度?
    • 它很慢,并且依赖于启用 .htaccess。
    • @meagar,我如何将此指令放置在虚拟主机中?
    • 超出了这些 cmets 的范围。问一个新问题。
    猜你喜欢
    • 2021-03-30
    • 1970-01-01
    • 1970-01-01
    • 2017-06-14
    • 2019-03-06
    • 2013-03-30
    • 2015-09-02
    • 1970-01-01
    • 2012-02-21
    相关资源
    最近更新 更多