避免使用laravel的公共文件夹并直接在Web服务器中打开根目录

问题描述 投票:0回答:10

我正在互联网上查看所有可能的示例来解决这个问题。还是很头疼。

我只是想避开

www.mylaravelsite.com/public/
中的“公众” 并将其设置为根目录的
www.mylaravelsite.com

现在我不想避免安全问题,所以我了解到

.htaccess
将是最好的方法。

朋友们有什么解决办法吗?

&提前感谢您的互动!

php .htaccess laravel webserver laravel-4
10个回答
60
投票

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

.cpanel/
public_html/
public_ftp/
..

laravel文件夹结构是

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

您可以在服务器上创建一个名为 mylaravelsite 的文件夹,与

public_html
public_ftp
文件夹内联,并将除公共文件夹之外的整个 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',

您的网站应该正在运行。


34
投票

在根文件夹中创建 .htaccess 并写入以下行

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

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


16
投票

听起来您缺少的信息是:

文档根目录

这也称为“网络根”。 Apache 特别将其称为 DocumentRoot - 单击该链接可获取官方说明。

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

public
文件夹。

将 DocumentRoot 设置为

public
意味着在浏览器中转到
http://mylaravelsite.com
实际上会根据需要“指向”
public
文件夹。

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

DocumentRoot

DocumentRoot /path/to/laravel-app/public

如何设置取决于您的主机。每个主机都有不同的网站设置方法,因此我们无法专门为您解答 - 您应该咨询您的网络主机技术支持。关键点是

public
目录应该是 Web 根目录,而其他所有内容都应该位于“Web 根目录后面”。

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


7
投票

只需在 Laravel 根目录中添加 .htaccess 文件(如果该文件不存在),然后在其中添加以下几行即可,

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

7
投票

在 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

或者将此代码添加到您的 .htaccess 中

RewriteEngine On
RewriteCond %{REQUEST_URI} !^/public/
RewriteRule ^(.*)$ /public/$1 [L,QSA]

5
投票

将您的网络目录指向

public/
。如果您使用 apache,这将起作用:

<VirtualHost *:80>
  DocumentRoot /var/www.mylaravelsite.com/public/
  ServerName www.mylaravelsite.com
</VirtualHost>

3
投票

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

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

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


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

谢谢


0
投票

对于流明

假设您有一个类似以下的文件夹路径:/var/www/project/microservice(lumen src)

/var/www => localhost/的文档根目录/

您想要的目标: 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]

0
投票

在服务器上(Apache) 在根文件夹中创建.htaccess并写入以下行

RewriteEngine on
RewriteCond %{REQUEST_URI} !^public
RewriteRule ^(.*)$ public/$1 [L]

更多地了解Gist

关于地方发展 您可以通过将以下行添加到 apache vhost 配置文件来创建虚拟主机。 一般来说,你可以在C:\xampp pach中找到这个文件

© www.soinside.com 2019 - 2024. All rights reserved.