42

我正在浏览互联网上所有可能的样本来解决这个问题。还是很头疼。

我只是想避免“公共”,www.mylaravelsite.com/public/ 让它像www.mylaravelsite.com根目录一样。

现在我不想回避安全问题,所以我学会了.htaccess会是最好的方法。

有解决的朋友吗?

并提前感谢您的互动!

4

9 回答 9

58

假设您的服务器中有此文件夹结构

.cpanel/
public_html/
public_ftp/
..

而laravel文件夹结构是

app/
bootstrap/
public/
vendor/
composer.json
artisan
..

你可以在你的服务器上创建一个名为 mylaravelsite 的文件夹,并与文件夹内联,public_html并将public_ftp除 public 文件夹之外的整个 laravel 应用程序复制到其中,因为你会将它的所有内容粘贴到 . public_html,所以你现在有:

.cpanel/
public_html/
public_html/packages
public_html/vendor
public_html/index.php
public_html/.htaccess
...
public_ftp/
mylaravelsite/
mylaravelsite/app
mylaravelsite/bootstrap
...

在您public_html/index.php更改以下行:

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

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

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

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

并且不要忘记更改 /mylaravelsite/bootstrap/paths.php公共路径,您可能会使用它。

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

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

您的网站应该正在运行。

于 2013-11-12T08:12:13.113 回答
32

在根文件夹中创建 .htaccess 并写下这些行

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteRule ^(.*)$ public/$1 [L]
</IfModule>

对于生产服务器,建议您将域直接指向公用文件夹

于 2016-04-18T07:29:33.190 回答
15

听起来您缺少的信息是:

文档根

这也称为“网络根”。Apache 专门将其称为DocumentRoot - 单击该链接以获取官方解释。

基本上它所做的是设置服务器从哪个目录中提取文件。在 Laravel 中,文档根目录应该是public文件夹。

将 DocumentRoot 设置为public意味着进入http://mylaravelsite.com浏览器实际上将根据需要“指向”public文件夹。

在 .htaccess 文件中(实际上,更有可能在虚拟主机配置中),您可以DocumentRoot为您的站点设置:

DocumentRoot /path/to/laravel-app/public

如何设置取决于您的主机。每个主机都有不同的网站设置方式,因此我们无法专门为您回答 - 您应该咨询您的网络主机技术支持。关键是该public目录应该是 Web 根目录,而其他所有内容都应该在“Web 根目录之后”。

公平警告寿:一些托管服务提供商没有为您提供足够的访问权限来实现这一目标。

于 2013-11-12T13:59:41.253 回答
6

如果它不存在,只需在 Laravel 根目录上添加 .htaccess 文件并在其中添加以下行,就是这样,

<IfModule mod_rewrite.c>  
   RewriteEngine On 
   RewriteRule ^(.*)$ public/$1 [L]
</IfModule>
于 2017-08-15T14:10:53.130 回答
5

将您的 Web 目录指向public/. 如果您使用的是 apache,这将起作用:

<VirtualHost *:80>
  DocumentRoot /var/www.mylaravelsite.com/public/
  ServerName www.mylaravelsite.com
</VirtualHost>
于 2013-11-12T07:33:56.327 回答
5

在您的 laravel 项目的根目录中创建 .htacess 文件并将此代码放入。

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

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ ^$1 [N]

RewriteCond %{REQUEST_URI} (\.\w+$) [NC]
RewriteRule ^(.*)$ public/$1 

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ server.php

于 2020-06-11T10:38:15.650 回答
3

这是解决方案,但不能在实际项目中这样做,它只是为了测试 Laravel 的初学者,我已经用 laravel 5.0 对其进行了测试,它是从公共文件夹中剪切 index.php 和 .htaccess 文件并将其粘贴到根目录并将这两行更改为

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

强烈建议不要在没有测试环境的情况下使用上述方法,而应使用虚拟主机。

于 2015-04-29T11:07:41.663 回答
1

您只需要更改 laravel 项目文件中的 .env 文件即可。如果你的 laravel 项目在里面

根/域/public_html/laravel/

转到 .env 文件并编辑

您需要编辑应该是的应用程序 url 路径

APP_URL= http://www.domainname.com/laravel/public/

那就是你的项目现在将运行。如果您的 laravel 文件在 public_html 中,那么您的应用程序 url 必须是这样的

APP_URL= http://www.domainname.com

谢谢

于 2016-12-31T10:53:16.370 回答
0

对于流明

假设您有一个文件夹路径,例如:/var/www/project/microservice(lumen src)

/var/www => 本地主机的文档根目录/

您想要的目标:localhost/project/microservice[/foo...] => localhost/project/microservice/public/foo...

我通过 .htaccess (位于 /project 文件夹)执行此操作,如下所示:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^.*/public/.*
RewriteCond %{REQUEST_URI} ^(/[^/]+/[^/]+/).*
RewriteRule ^[^/]+(.*)$ %1public$1 [L,R=301,P]
于 2019-05-21T01:54:09.393 回答