Laravel 部署共享主机子域

Posted

技术标签:

【中文标题】Laravel 部署共享主机子域【英文标题】:Laravel deployment shared hosting subdomain 【发布时间】:2021-06-28 23:38:58 【问题描述】:

嗨,我花了几个小时让我的网站在共享主机上运行,​​但什么也没发生(本地还可以), 搜索了一些主题并遵循了教程,但无法解决无法加载引导程序和 livewire 组件的问题。

我按照经典步骤将公用文件夹复制到我的子域的根目录,其他文件位于子域路径内的单独文件夹中,如 Laravel 文件夹 我更改了 public/index.php 并且我得到了类似this

你可以看到 livewire 并且引导程序不起作用。

我也尝试让文件夹作为原始文件夹,我的路径是公共的,结果就像this 和一切正常!

css和livewire不起作用的索引路径:

<?php

use Illuminate\Contracts\Http\Kernel;
use Illuminate\Http\Request;

define('LARAVEL_START', microtime(true));

/*
|--------------------------------------------------------------------------
| Check If Application Is Under Maintenance
|--------------------------------------------------------------------------
|
| If the application is maintenance / demo mode via the "down" command we
| will require this file so that any prerendered template can be shown
| instead of starting the framework, which could cause an exception.
|
*/

if (file_exists(__DIR__.'/../storage/framework/maintenance.php')) 
    require __DIR__.'/../storage/framework/maintenance.php';


/*
|--------------------------------------------------------------------------
| Register The Auto Loader
|--------------------------------------------------------------------------
|
| Composer provides a convenient, automatically generated class loader for
| this application. We just need to utilize it! We'll simply require it
| into the script here so we don't need to manually load our classes.
|
*/

require __DIR__.'/laravel/vendor/autoload.php';

/*
|--------------------------------------------------------------------------
| Run The Application
|--------------------------------------------------------------------------
|
| Once we have the application, we can handle the incoming request using
| the application's HTTP kernel. Then, we will send the response back
| to this client's browser, allowing them to enjoy our application.
|
*/

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

$kernel = $app->make(Kernel::class);

$response = tap($kernel->handle(
    $request = Request::capture()
))->send();

$kernel->terminate($request, $response);

我知道我没有放 /../,因为如果我放那个,我得到错误无法识别路径,可能是因为是子域,并且没有 public_html 文件夹。 是什么导致了这个问题?引导的路径是正确的..

Web.config:

<!--
    Rewrites requires Microsoft URL Rewrite Module for IIS
    Download: https://www.iis.net/downloads/microsoft/url-rewrite
    Debug Help: https://docs.microsoft.com/en-us/iis/extensions/url-rewrite-module/using-failed-request-tracing-to-trace-rewrite-rules
-->
<configuration>
  <system.webServer>
    <rewrite>
      <rules>
        <rule name="Imported Rule 1" stopProcessing="true">
          <match url="^(.*)/$" ignoreCase="false" />
          <conditions>
            <add input="REQUEST_FILENAME" matchType="IsDirectory" ignoreCase="false" negate="true" />
          </conditions>
          <action type="Redirect" redirectType="Permanent" url="/R:1" />
        </rule>
        <rule name="Imported Rule 2" stopProcessing="true">
          <match url="^" ignoreCase="false" />
          <conditions>
            <add input="REQUEST_FILENAME" matchType="IsDirectory" ignoreCase="false" negate="true" />
            <add input="REQUEST_FILENAME" matchType="IsFile" ignoreCase="false" negate="true" />
          </conditions>
          <action type="Rewrite" url="index.php" />
        </rule>
      </rules>
    </rewrite>
  </system.webServer>
</configuration>

htaccess:

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews -Indexes
    </IfModule>

    RewriteEngine On

    # Handle Authorization Header
    RewriteCond %HTTP:Authorization .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%HTTP:Authorization]

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %REQUEST_FILENAME !-d
    RewriteCond %REQUEST_URI (.+)/$
    RewriteRule ^ %1 [L,R=301]

    # Send Requests To Front Controller...
    RewriteCond %REQUEST_FILENAME !-d
    RewriteCond %REQUEST_FILENAME !-f
    RewriteRule ^ index.php [L]
</IfModule>

【问题讨论】:

为什么要使用共享主机?你甚至有 SSH 访问权限吗?重要的是 Apache 或 nginx 文档根目录是 LARAVEL_ROOT/public 就是这样,然后一切都应该在根目录中,例如 appbootstrapstorage 等文件夹... 因为是 vfm 选项而不是空间有限的昂贵 vps,所以我有 ssh 访问权限,但我现在不知道如何修复它们 您使用的是 Apache 还是 Nginx ?您能否在帖子中分享您网站的配置文件? @matiaslauriti 我在 Hostinger 共享主机上,我正在使用 Apache,我在帖子上上传了 htaccess 和 web.config 我不知道托管商有什么。如果您使用的是 Apache,您可以共享 /etc/apache2/sites-available 上的虚拟主机吗? 【参考方案1】:

为时已晚,但希望对未来的观众有用

从我能读到的 cmets 中,您正在使用 Hostinger,

这是一个快速解决方法,

在您的主机帐户中 > 选择

托管帐户 > 域 > 子域

输入子域名和

检查子域的自定义文件夹

输入你的项目路径,后跟 laravel 的公共目录

例如,

/home/u796769252/public_html/<subdomain>/public

瞧,

您现在可以将 laravel 核心文件粘贴到 suddomain 并将公用文件夹文件粘贴到公用文件夹。

我写了一个blog,其中提到了如何在不编辑 laravel 核心文件的情况下将 laravel 应用程序发布到共享主机。

【讨论】:

是的,它成功了,我又遇到了同样的问题,我完全按照您的指示进行操作,终于成功了!非常感谢

以上是关于Laravel 部署共享主机子域的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 与子域共享主机

如何在子域共享主机上安装 laravel

拉拉维尔 |共享主机路由无法正常工作

无法使用 Laravel 4 与子域共享会话

部署 laravel + vuejs 到共享主机

在共享主机中部署后 Laravel 结构损坏