Laravel |共享主机路由无法正常运行

时间:2017-07-02 07:23:31

标签: apache laravel .htaccess redirect mod-rewrite

我正在尝试在共享主机(godaddy)上部署我的Laravel项目,到目前为止,我只是部分成功了。

我遵循的步骤:

  • 创建子域abc.xyz.com,root - > public_html/finance/.
  • 将我的laravel项目上传到与public_html
  • 处于同一级别的文件夹
  • softlink我的项目的public目录到public_html/finance/
  • 我发现转到abc.xyz.com不起作用,abc.xyz.com/public这样做了,所以我设置了一个重定向,将abc.xyz.com重定向到abc.xyz.com
  • 使Storage可供网络访问。
  • dumpautoload,缓存configroutes
  • 迁移databases

现在我可以成功登录,这会将我带到abc.xyz.com/public但是我没有/public的所有其他路由都不起作用。 例如:

  • abc.xyz.com/public - works
  • abc.xyz.com/home - 无效

我注意到,如果我手动将/public添加到他们工作的所有路线!所以abc.xyz.com/public/home有效。

我的.htaccess:

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

    RewriteEngine On

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

    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]

    # Handle Authorization Header
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
</IfModule>

那么如何将/public abc.xyz.com/public添加到所有路线? 我不是很擅长修改.htaccess,但我尝试了一些来自网上的解决方案,但它们没有用。

5 个答案:

答案 0 :(得分:3)

  

摘自Deploy Laravel 5 App on Shared Hosting on Linux Server。原作者是DonkarnashPassionInfinitePete HoustonKyslik。归因详情可在contributor page上找到。该来源在CC BY-SA 3.0下获得许可,可以在Documentation archive中找到。参考主题ID:2410。

默认情况下,Laravel项目的public文件夹会公开应用程序的内容,任何人都可以从任何地方请求,其他应用程序代码对于没有适当权限的人来说是不可见的或无法访问的。

在开发机器上开发应用程序后,需要将其推送到生产服务器,以便可以从任何地方通过互联网访问 - 对吗?

对于大多数应用程序/网站,首选是使用托管服务提供商(如GoDaddy,HostGator等)的共享托管包,主要是因为成本低。

  

注意:您可以要求您的提供商手动更改 document_root ,因此您只需将Laravel应用程序上传到服务器(通过FTP),请求更改root到 {app} / public ,你应该很好。

但是,此类共享主机软件包在终端访问和文件权限方面存在限制。默认情况下,必须将其应用/代码上传到其共享主机帐户上的public_html文件夹。

因此,如果您想将Laravel项目上传到共享主机帐户,您会怎么做?您应该将整个应用程序(文件夹)上传到共享主机帐户的public_html文件夹吗? - 肯定没有

因为public_html文件夹中的所有内容都可以访问&#34;公开,即任何人都可以使用#34;这将是一个很大的安全风险。

将项目上传到共享主机帐户的步骤 - Laravel方式

第1步
在与public_html文件夹相同的级别上创建一个名为laravel(或您喜欢的任何内容)的文件夹。

Eg:  
/
|--var  
    |---www
        |----laravel       //create this folder in your shared hosting account
        |----public_html  
        |----log  

第2步
 从public文件夹(在服务器主机 - 共享主机帐户上)的laravel项目(在开发计算机上)复制除laravel文件夹之外的所有内容。
你可以使用:
  - C面板:这是最慢的选择   - FTP客户端:如 FileZilla 连接到您的共享主机帐户并通过FTP上传传输您的文件和文件夹
  - 映射网络驱动器:您还可以在开发计算机上创建映射网络驱动器,以使用&#34; ftp://your-domain-name&#34;连接到共享主机帐户的根文件夹。作为网络地址。

第3步
 打开laravel项目的public文件夹(在开发计算机上),复制所有内容并粘贴到public_html文件夹中(在服务器主机上 - 共享主机帐户)。
第4步
现在打开共享主机帐户的index.php文件夹中的public_html文件(在cpanel编辑器或任何其他连接的编辑器中)和:

更改:

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

收件人:

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

并更改:

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

收件人:

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

保存并关闭。

第5步
 现在转到laravel文件夹(在共享主机帐户 - 服务器上)并打开server.php文件
更改

require_once __DIR__.'/public/index.php';

收件人:

require_once __DIR__.'../public_html/index.php';  

保存并关闭。

第6步
laravel/storage文件夹(递归)以及共享主机帐户中的所有文件,子文件夹和文件的文件权限设置为777
注意: 小心linux中的文件权限,它们就像双刃剑,如果使用不当,它们可能会使你的应用容易受到攻击。要了解Linux文件权限,您可以阅读https://www.linux.com/learn/tutorials/309527-understanding-linux-file-permissions

第7步

由于本地/开发服务器的.env文件被git忽略,因此它应该被忽略,因为它包含所有环境变量,包括APP_KEY,并且不应该通过将其推送到存储库来公开它。 ;。您还可以看到.gitignore文件中提到了.env,因此它不会将其上传到存储库。

完成上述所有步骤后,在laravel文件夹中创建一个.env文件,并将您使用的所有环境变量从本地/开发服务器的.env文件添加到{ {1}}生产服务器的文件。

即使在laravel应用程序的配置文件夹中有.envapp.php等配置文件,它在database.php的第二个参数中默认定义了这些变量,但并不难 - 对这些文件中的值进行编码,因为它会影响拉动存储库的用户的配置文件。因此建议手动创建env()文件!

laravel还提供了.env文件,您可以将其用作参考。

那就是它。

现在,当您访问使用服务器配置为域的URL时,您的laravel应用程序应该像在localhost - development机器上一样工作,而应用程序代码仍然是安全的,没有适当文件的任何人都无法访问权限。

答案 1 :(得分:1)

您可以将public / .htaccess和public / index.php移动到laravel项目的根文件中。

答案 2 :(得分:1)

您需要将网站的文档根目录更改为应用程序的公用文件夹,即

public_html/finance/.

应该是:

public_html/finance/public

https://laravel.com/docs/5.4/installation#configuration

希望这有帮助!

答案 3 :(得分:0)

问题是您已将整个项目放在公共目录中 - public_html,不是吗?这是一种不好的做法(安全)。

您的域名(abc.xyz.com)指向您的应用程序根目录,应该转到app / public目录。

答案 4 :(得分:0)

更新解决方案:需要 DIR 。'/ .. / bootstrap / autoload.php';
    现在:需要 DIR 。'/ .. / vendor / autoload.php';
因此,更改为 require __DIR__.'/../laravel/vendor/autoload.php';