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

Sag*_*dal 36 php .htaccess webserver laravel laravel-4

我正在通过互联网上的所有可能的样本来解决这个问题.仍然令人头疼.

我只是想避免使用'public' www.mylaravelsite.com/public/ 并使其像www.mylaravelsite.com根目录一样.

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

任何解决方案的朋

并提前感谢您的互动!

luk*_*rat 54

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

.cpanel/
public_html/
public_ftp/
..
Run Code Online (Sandbox Code Playgroud)

并且laravel文件夹结构是

app/
bootstrap/
public/
vendor/
composer.json
artisan
..
Run Code Online (Sandbox Code Playgroud)

您可以在服务器上内嵌public_htmlpublic_ftp文件夹创建文件夹名称mylaravelsite ,并将除了公共文件夹之外的整个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
...
Run Code Online (Sandbox Code Playgroud)

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

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

$app = require_once __DIR__.'/../bootstrap/start.php';
Run Code Online (Sandbox Code Playgroud)

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

$app = require_once __DIR__.'/../mylaravelsite/bootstrap/start.php';
Run Code Online (Sandbox Code Playgroud)

并且也不要忘记改变 /mylaravelsite/bootstrap/paths.php公共路径,你可以使用它.

'public' => __DIR__.'/../public',
Run Code Online (Sandbox Code Playgroud)

'public' => __DIR__.'/../../public_html',
Run Code Online (Sandbox Code Playgroud)

您的网站应该正在运行.

  • 兄弟,我已按照您的指示完成所有操作,而是显示 404 页面。我该怎么办 ? (2认同)

小智 20

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

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

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


fid*_*per 14

听起来你缺少的信息是:

的DocumentRoot

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

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

将DocumentRoot设置为public意味着进入http://mylaravelsite.com浏览器将实际上"指向" public您想要的文件夹.

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

DocumentRoot /path/to/laravel-app/public
Run Code Online (Sandbox Code Playgroud)

你如何设置它取决于你的托管.每个主机都有不同的方式来设置网站,所以我们无法专门为您解答 - 您应该咨询您的网站托管技术支持.关键是该public目录应该是Web根目录,而其他所有内容应该是"在Web根目录后面".

公平警告:一些托管服务提供商没有给你足够的访问权来实现这一目标.


Ima*_*lah 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
Run Code Online (Sandbox Code Playgroud)

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

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


luk*_*rat 5

将您的网络目录指向public/.如果您使用的是apache,这将有效:

<VirtualHost *:80>
  DocumentRoot /var/www.mylaravelsite.com/public/
  ServerName www.mylaravelsite.com
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

  • 您必须更改您不能使用的apache配置,因为您托管在虚拟主机软件包而不是虚拟服务器上. (2认同)

小智 5

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

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