【问题标题】:How put Laravel site on shared hosting which has multiple other sites in subdirectories?如何将 Laravel 站点放在子目录中有多个其他站点的共享主机上?
【发布时间】:2017-01-22 17:29:32
【问题描述】:

我有一个 Laravel 站点在我的机器上本地运行,但我想让它上线。我已经为共享主机付费,并且我在共享主机上运行了许多站点,位于它们自己的子目录中。例如,在共享主机中,我有:

public_html/site1
public_html/site2
etc.

这些都是个人网站。所以我想把我的 Laravel 网站也放在那里:

public_html/laravelsite

问题是我显然不希望大多数文件实际上可以公开访问。但是,如果我将它们分开并将public 站点文件放入public_html/laravelsite 并将其余文件放在public_html 上方的文件夹中,则将无法找到其他任何内容,并且该站点将无法运行。

我可以使用其他解决方法来保护我的文件吗?

【问题讨论】:

    标签: php laravel laravel-5 shared-hosting


    【解决方案1】:

    当用户请求您的网站时,起点始终是public/inde.php。所以把公用文件夹放在你想要的地方,其余的(Laravel)放在你想要的地方。然后从public/index.php,尝试链接bootstrap/autoload.php

    例如,在您的情况下,您将转到 public/index.php 并更改第 22 和 36 行,以便他们仍然可以像这样找到 autload.php 文件:

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

    变成

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

    还有

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

    变成

    35. $app = require_once __DIR__.'/../../laravel_folder/bootstrap/app.php';
    

    还有其他方法可以做到这一点。只需找到适合您需求的那一款即可。

    对于 Elixir,“...您可以使用 ./ 开始任何文件路径。这指示 Elixir 从项目根目录开始,而不是使用默认的基本目录”。来源:https://laravel.com/docs/5.3/elixir。所以你必须做这样的事情来改变来源

    elixir(function(mix) {
        mix.sass('./app/assets/sass/app.scss');
    });
    

    您可以执行相同的操作来更改目的地。 现在,如果您想尽量减少 dev 和 prod 之间的差异,请重新组织 dev 中的文件夹以具有相似的结构。

    【讨论】:

    • 谢谢,这似乎奏效了,虽然我仍然收到一个错误,因为我做了一个 git clone 并忘记了 node_modules 和 vendor 没有被保存到 repo。一旦我传输了所有文件并确认它正在工作,我会选择这个作为正确答案 - 谢谢!
    • 我仍然收到错误消息:“文件 css/all.css 未在资产清单中定义。”我假设它与目录路径已更改的事实有关,但我无法弄清楚如何修复它。
    • 我把 {{ elixir('css/all.css') }} 取出来,清除缓存,直接放入链接。这似乎已经解决了。
    • 好酷。那你会接受这个答案吗?抱歉没来这里回复您的评论。至于资产,没有任何改变,因为正如我之前所说,一切都从public/index.php 开始。因此,从public,您仍然可以像在本地计算机上一样链接到您的资产。
    • 资产的问题是 Elixir 的路径没有改变,所以 Elixir 找错地方了。我正在四处寻找其他解决方案,因此我不必修改 Elixir 配置(我宁愿在生产中修改尽可能少的东西,以尽量减少从我的开发箱推送时出现的问题)。
    【解决方案2】:

    尝试打开AppServiceProvider.php并修改如下:

    <?php namespace App\Providers;
    
    use Illuminate\Support\ServiceProvider;
    
    class AppServiceProvider extends ServiceProvider {
    
        public function register()
        {
            $this->app->bind('path.public', function() {
                return base_path().'/public_html/laravelsite';
            });
        }
    }
    

    并将public文件夹的内容放到laravelsite文件夹中。

    【讨论】:

    • 感谢您的回复!我想我可能会采用另一种解决方案,但这个看起来也不错。
    【解决方案3】:

    最明显的解决方案 - 只是告诉您的服务器不要提供来自 /public_html/laravelsite 的文件?

    例如,如果您的共享主机使用的是 apache,请在 /public_html/laravelsite 中创建一个 .htaccess 文件

    Deny from all
    

    然后到public目录下你的laravel的.htaccess文件添加

    Allow from all
    

    【讨论】:

    • 嗯,这很简单。
    猜你喜欢
    • 2020-03-23
    • 1970-01-01
    • 2017-08-30
    • 1970-01-01
    • 1970-01-01
    • 2021-05-05
    • 2011-05-05
    • 1970-01-01
    • 2015-05-13
    相关资源
    最近更新 更多