如何将Laravel 4安装到Web主机子文件夹中,而不公开显示/app/文件夹?

62

我想知道是否有一种方法可以在网络主机的子目录/子文件夹中安装Laravel 4,同时不暴露/app/文件夹和其他敏感文件给主机的公开可访问部分。

我的想法是,我可以访问http://mydomain.example/mylaravel/来使用Laravel,但同时我想避免任何人做类似于访问http://mydomain.example/app/http://mydomain.example/mylaravel/app/ 的事情并且基本上能看到我的配置文件和其他代码。

9个回答

65

我已经想出如何做到这一点。我将通过一个例子来解释。

假设您有一个域名:http://domain.example。这是您可能正在使用的结构示例:

domain.example/    (the root of your web hosting)
|-- yourlaravel4_base/
|-- [some other folders...]
|-- public_html/    (where your html files and such go)
|   |-- [some other folders...]
|   |-- yourlaravel4/

/public_html/ 是您的网站托管文件公开访问部分的根目录。您想在 /public_html/ 中创建一个子文件夹(在这种情况下为 /public_html/yourlaravel4/)。在这个子文件夹中,您将存储 Laravel 4 public/ 文件夹的所有内容。

现在,对于其余的文件。您需要进入您的 Web 托管文件的根目录,也就是您想要处于 domain.example/ 级别,因此能够看到 public_html/ 和其他一些文件夹。然后,我们需要在这里创建一个文件夹,用于存储 Laravel 4 的基本文件。在这种情况下,它是 domain.example/yourlaravel4_base/。在 yourlaravel4_base/ 内,我们需要存储存在于基本 Laravel 4 目录中的每个文件和文件夹。这将包括 app/, bootstrap/, vendor/, server.php,等等。除了您已经存储在 public_html/yourlaravel4/ 中的 /public/ 文件夹及其内容之外的所有内容。

最后,我们需要编辑 2 个文件:Laravel 的 /bootstrap/paths.php/public/index.php


paths.php 文件中,将以下内容替换为:

'app' => __DIR__.'/../app',

随着:

'app' => __DIR__.'/../../yourlaravel4_base/app',
paths.php 文件中,替换以下内容:

'public' => __DIR__.'/../public',

随着:

'public' => __DIR__,

paths.php 文件中,将以下内容替换为:

'base' => __DIR__.'/..',

使用:

'base' => __DIR__.'/../../yourlaravel4_base',

paths.php 中替换:

'storage' => __DIR__.'/../app/storage',

与:

'storage' => __DIR__.'/../../yourlaravel4_base/app/storage',
index.php 文件中,将以下内容替换为:
require __DIR__.'/../bootstrap/autoload.php';

随着:

require __DIR__.'/../../yourlaravel4_base/bootstrap/autoload.php';

index.php 文件中,将以下内容替换为:

$app = require_once __DIR__.'/../bootstrap/start.php';

随着:

$app = require_once __DIR__.'/../../yourlaravel4_base/bootstrap/start.php';

上传更改。现在您应该能够在网站的子文件夹中安装Laravel 4,而不必实际暴露app/文件夹和其他敏感文件。 :)


1
我需要编辑的唯一文件就是config/app.php文件,将URL指向包含公共文件夹内容的文件夹位置以及/public/index.php文件路径。棘手的部分是知道要添加多少个“../../”。另外,在引号后面不要加斜杠(是)DIR.'../建议不要(否)DIR.'/../。 - Duramba
回答得非常好,谢谢。对于我的情况,这是一个不完整的解决方案,没有@TechyTimo的贡献。顺便问一下,为什么这个答案(投票最高,被接受的答案)在答案列表中排名最低? - Hamman Samuel
不幸的是,如果您的主机执行一些愚蠢的重写基础操作,即使根目录存在,您也无法从Web应用程序访问它,这种方法并不总是有效。 这是一个很好的总结,包括此选项,请参阅此处:http://driesvints.com/blog/laravel-4-on-a-shared-host。 - Rob Grant
@EmmanuelFiguerola 我按照你说的做了一切,但是我得到了以下警告:`Warning: require(/home/u962269517/public_html/vendor/swiftmailer/swiftmailer/lib/swift_required.php): failed to open stream: No such file or directory in /home/u962269517/public_html/vendor/composer/autoload_real.php on line 58Fatal error: require(): Failed opening required '/home/u962269517/public_html/vendor/swiftmailer/swiftmailer/lib/swift_required.php' (include_path='/home/u962269517/public_html/vendor/phpseclib/phpseclib/phpseclib:.:/usr/lib/php') in /home/u962269517/public_html/vendor/composer/autoload_real.php on line 58` - alexventuraio
1
只是好奇,这个能用于 Laravel 5 吗?我正在计划使用 L5。 - VijayRana

28

您可以使用别名:在系统中广泛使用的目录中不需要进行任何操作。

在httpd.conf或管理面板中指定:

/mylaravel/ /path/to/laravel/public

此外,在 Laravel 的 app.php 文件中指定URL。

第29行。

'url' => 'http://yourdomain.example/mylaravel/',

最终在您的 /public/.htaccess 文件中设置 RewriteBase

RewriteBase /mylaravel/

功能强大,可以保持目录结构干净简洁!


这似乎是实际答案。 - Dan
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - paulalexandru
1
请在httpd.conf或管理面板中指定/mylaravel/ /path/to/laravel/public路径。你能告诉我怎么做吗? - Gaurav Gupta

7

大家,不要过于复杂化事情!

(对于其他公共文件夹,例如htdocswww,只需将以下的public_html替换为您自己的文件夹即可。)

  1. 将您所有的Laravel内容放在顶层文件夹中(使app文件夹与public_html文件夹并排)。
  2. 将所有文件从public移动到public_html(一定要移动隐藏文件,如.htaccess!)。
  3. 删除现在空的public文件夹。
  4. bootstrap/path.php中更改

    'public' => __DIR__.'/../public',

    'public' => __DIR__.'/../public_html',

  5. 完成。

2
这就是我所做的...防弹的,对吧?如果您不希望app/在公共目录中可见,请不要将其放在公共目录中! - Adam Marshall
针对GoDaddy共享托管:https://medium.com/@kunalnagar/deploying-laravel-5-on-godaddy-shared-hosting-888ec96f64cd - PhatHV
1
这并没有回答问题,因为问题是如何将它放在子文件夹中。 - Trekdrop

3

Emmanuel的答案对我没有用,但我做了一些更改使它可以工作。虽然我使用我的网站根目录作为项目的来源。

这里有:

我有一个htdocs文件夹作为根文件夹,但你可能有其他的,比如public_html、www等等。你可以轻松地用你自己的文件夹代替我的htdocs。

好吧。

我的目录

root/ 
      htdocs
      .htaccess
      .override

首先,我使用Composer在我的Windows本地主机上解决了所有Laravel依赖关系。之后,我将整个包打包成了laravel4.zip。在我的htdocs中,我创建了一个laravel文件夹,并在其中上传并解压缩zip文件。

htdocs/
        laravel/
                 app
                 bootstrap
                 public 
                 vendors
                 ...

所以,在我解压缩文件之后,我把public文件夹中的所有东西移动到htdocs文件夹中。

htdocs/
        laravel
        packages
        .htaccess
        favicon.ico
        index.php
        robots.txt

现在,我们需要重写htdocs/index.php和htdocs/laravel/bootstrap/paths.php中的一些路径。

但让我们先打开htdocs/laravel/bootstrap/paths.php。你会看到

'app' => __DIR__.'/../app',

这意味着我们正在htdocs/laravel/bootstrap/路径下。因此,我们需要退出该文件夹到laravel文件夹,然后进入app文件夹。好吧。这是Laravel的路由结构。如果你理解了这个,你就可以使Laravel运行。

找到

'public' => __DIR__.'/../public',

并将其更改为

'public' => __DIR__.'/../../htdocs',

(简单吧)用一个(../),我们可以向上走一层文件夹。所以现在我们在laravel文件夹中。但是我们需要在htdocs中。所以我们必须写另一个(../)来到达那里。

打开htdocs/index.php并查找

require __DIR__.'/../bootstrap/autoload.php';

将其更改为

require 'laravel/bootstrap/autoload.php';

require是一个内置的php函数,所以我们将它视为一个简单的php。我们不需要Laravel样式来获取autoload.php文件。所以简单地移除它并使用经典样式。

查找

$app = require_once __DIR__.'/../bootstrap/start.php';

将其更改为

$app = require_once 'laravel/bootstrap/start.php';

很高兴看到Laravel对你有用。路径问题很棘手,我甚至曾经有一个项目,由于某种奇怪的原因,需要使用文件的完整路径。 :/ - Emmanuel Figuerola

2

如果您想将Laravel 5.1运行在共享托管空间中,而所有上述答案似乎与实际的Laravel文件/文件夹有所不同,或者您正在寻找如何将您的Laravel 5/5.1放入共享托管空间的子目录中,以便您可以像这样访问它:

http://mywebsite.example/mylaravel/

首先确保您符合Laravel 5.1的要求:

  • PHP 5.5
  • PHP扩展Mcrypt
  • PHP扩展Mbstring
  • PHP扩展OpenSSL

以下是两篇易于理解的教程:


1
如果您想要在共享托管上简单设置 Laravel 项目并且您拥有 cPanel 访问权限,则可以按照以下步骤进行操作,这是我所遵循的步骤,并且它效果很好。
步骤 1:在本地计算机上制作整个 Laravel 应用程序的 zip 或 tar 文件。
步骤 2:进入 Cpanel。将 zip/tar 文件上传到 public_html 目录,然后进行解压缩。(您也可以为 Laravel 应用程序创建单独的文件夹。由于我想上传多个 Laravel 应用程序,因此我为每个应用程序创建了单独的目录,如下图所示。)

enter image description here

第三步:现在进入“插件域名”,更改您指定域名的文档根目录。将该域名指向公共文件夹。

enter image description here

现在检查您的域名,它将重定向到public/index.php文件。无需更改任何路径。

这个对我有用。重要的是要检查当前的PHP版本是否为5.6,因为其他版本会完全阻止Laravel应用程序的工作。 - Cornwell

1
如果您正在cPanel中使用附加域名或子域名向导,则向导应该会要求您提供文档根目录。
例如,我想添加 droidman.example。向导应该建议我创建一个 droidman.example 文件夹。在这一步中,请告诉向导创建 droidman.example/public 文件夹。然后将您的应用程序放在 droidman.example 文件夹中。您的主机将查看 public 文件夹。

0
如果您正在使用Apache服务器,则最简单的方法是将Laravel应用程序托管在www根目录之外(或在www根目录中的受保护文件夹中),然后将所需的子文件夹符号链接到指向Laravel中的public文件夹。
例如,我将我的Laravel安装放在:
/usr/local/share/myLaravel

然后,在您的公共www文件夹中创建符号链接,如下所示:

ln -s /usr/local/share/myLaravel/public mylaravel

你需要对安装进行一些调整,比如将 Rewrite Base 设置为 /mylaravel/,并确保你的配置文件允许在基础位置进行覆盖,但这比修改所有内容要简单。


-4

请确保检查您的权限。虽然我不建议这样做,但我是通过以下方式部署的。

我使用了SSH并执行了类似以下命令:

rm -rf public_html/ // WARNING: READ NOTE AT THE BOTTOM BEFORE RUNNING

ln -s project_folder/public/ public_html  // where the format is ln -s target name

之后,我会收到一个信息,例如“糟糕,看起来出了些问题”(或者根据您的调试设置是错误)。为了解决这个问题,我只需要将我的文件夹权限更改为755

总的来说,我将回去尝试原始方式并更改权限,因为我发现这种方式不太安全,更多地依赖于我的托管客户服务。

*****注意***** 这个命令显然会删除您的public_html文件夹(有时也称为public或www)。你需要备份其中所有的文件,因为你正在删除它。此外,你需要准备好通过客户服务来恢复它。许多托管服务不允许你自己重新创建文件夹。


rm -rf public_html/ 真的很可怕! - Set Kyar Wa Lar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接