拉拉维尔 |共享主机路由无法正常工作
Posted
技术标签:
【中文标题】拉拉维尔 |共享主机路由无法正常工作【英文标题】:Laravel | Shared hosting routes not working properly 【发布时间】:2017-12-05 17:00:12 【问题描述】:我正在尝试在共享主机(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
,缓存config
和routes
。
正在迁移databases
。
现在我可以成功登录,这会将我带到abc.xyz.com/public
,但我所有其他没有/public
的路线都不起作用。
例如:
我注意到,如果我手动将/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
,但我尝试了网上的一些解决方案,但都没有奏效。
【问题讨论】:
【参考方案1】:你可能可以将你的 public/.htaccess 和 public/index.php 移动到你的 laravel 项目的根文件中。
【讨论】:
非常感谢。在网络上的所有教程中,您的解决方案是唯一有效的解决方案。【参考方案2】:问题是你把整个项目放在了公共目录——public_html,不是吗?这是一种不好的做法(安全性)。
您的域 (abc.xyz.com) 指向您的应用程序根目录,应该转到 app/public 目录。
【讨论】:
如果你仔细阅读我遵循的步骤你就会知道我没有【参考方案3】:您需要将网站的文档根目录更改为应用程序的公共文件夹,即
public_html/finance/.
应该是:
public_html/finance/public
https://laravel.com/docs/5.4/installation#configuration
希望这会有所帮助!
【讨论】:
【参考方案4】:摘自Deploy Laravel 5 App on Shared Hosting on Linux Server。原作者是Donkarnash、PassionInfinite、Pete Houston 和Kyslik。归属细节可以在contributor page 上找到。该源在CC BY-SA 3.0 下获得许可,可以在Documentation archive 中找到。参考主题ID:2410。
默认情况下,Laravel 项目的 public
文件夹会公开应用程序的内容,任何人都可以从任何地方请求该应用程序的内容,没有适当权限的任何人都看不到或无法访问应用程序的其余代码。
在您的开发机器上开发应用程序后,需要将其推送到生产服务器,以便可以从任何地方通过互联网访问它 - 对吧?
对于大多数应用程序/网站,首选是使用托管服务提供商(如 GoDaddy、HostGator 等)提供的共享托管包,主要是因为成本低。
注意:您可以要求您的提供商手动更改 document_root,因此您只需将 Laravel 应用程序上传到服务器(通过 FTP),请求更改根到 app/public,你应该很好。
但是,此类共享主机包在终端访问和文件权限方面确实存在限制。默认情况下,必须将他们的应用程序/代码上传到他们共享主机帐户上的public_html
文件夹。
如果你想将 Laravel 项目上传到共享主机帐户,你会怎么做?您是否应该将整个应用程序(文件夹)上传到共享主机帐户上的public_html
文件夹? - 肯定没有
因为public_html
文件夹中的所有内容都可以“公开,即任何人”访问,这将是一个很大的安全风险。
将项目上传到共享主机帐户的步骤 - Laravel 方式
第 1 步
在 public_html
文件夹的同一级别上创建一个名为 laravel(或任何你喜欢的东西)的文件夹。
Eg:
/
|--var
|---www
|----laravel //create this folder in your shared hosting account
|----public_html
|----log
第 2 步
从您的 laravel 项目(在开发机器上)复制除 public
文件夹之外的所有内容到 laravel
文件夹(在服务器主机 - 共享主机帐户上)。
您可以使用:
- C-panel:这将是最慢的选项
- FTP 客户端:像 FileZilla 连接到您的共享主机帐户并通过 FTP 上传传输您的文件和文件夹
- 映射网络驱动器:您还可以在开发机器上创建映射网络驱动器,以使用“ftp://your-domain-name”作为网络地址连接到共享主机帐户的根文件夹。
第 3 步
打开您的 laravel 项目的 public
文件夹(在开发机器上),复制所有内容并粘贴到 public_html
文件夹(在服务器主机 - 共享主机帐户上)。第 4 步
现在打开共享主机帐户上public_html
文件夹中的index.php
文件(在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
文件中使用的所有环境变量添加到生产服务器的 .env
文件中。
即使在 laravel 应用程序的 config 文件夹中有 app.php
、database.php
之类的配置文件,默认情况下在 env()
的第二个参数中定义此变量,但不要硬编码这些文件中的值将影响拉取您的存储库的用户的配置文件。所以建议手动创建.env
文件!
laravel 还提供了 .env-example
文件,您可以将其用作参考。
就是这样。
现在,当您使用服务器访问配置为域的 url 时,您的 laravel 应用程序应该可以像在 localhost - 开发机器上一样工作,而应用程序代码仍然是安全的,没有适当文件的任何人都无法访问权限。
【讨论】:
什么是 .htaccess 代码。可以分享一下吗? 请单独提问。 请单独提出一个问题,详细说明为什么它不适合您。 与 Laravel 8 项目完美配合。非常感谢。【参考方案5】:更新解决方案:需要 DIR.'/../bootstrap/autoload.php';
现在是:需要 DIR.'/../vendor/autoload.php';
所以改成 require __DIR__.'/../laravel/vendor/autoload.php';
【讨论】:
【参考方案6】:除了指向正确的文件和文件夹之外,添加下面的 .htaccess 文件。信用 - Kylevorster
<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>
【讨论】:
以上是关于拉拉维尔 |共享主机路由无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章
laravel 中的护照详细信息 api 在本地主机上可以正常工作,但不能在共享主机上运行