Laravel 5 - 从URL中删除Public

时间:2015-02-06 11:13:39

标签: php .htaccess laravel mamp laravel-5

我知道这是一个非常受欢迎的问题,但我还没有能够为Laravel 5找到一个可行的解决方案。我一直试图从Codeigniter迁移很长一段时间,但这个复杂的安装过程一直让我失望。

我不想运行虚拟机,这在项目之间切换时似乎很尴尬。

我不想将我的文档根目录设置为公共文件夹,这在项目之间切换时也很尴尬。

我已经尝试过.htaccess mod_rewrite方法

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

这只是在compile.php第7610行中给了我一个Laravel NotFoundHttpException。

我刚刚尝试L4时,我使用了将公用文件夹的内容移动到根目录的方法。 L5的结构完全不同,按照相同的步骤完全破坏了Laravel(服务器只返回一个空白页)。

是否有一种不错的方法可以删除公众&#39;在开发环境中:

  1. 与L5合作
  2. 允许我轻松切换项目(我通常在任何时候使用2或3)。
  3. 由于

    **我正在使用MAMP和PHP 5.6.2

40 个答案:

答案 0 :(得分:379)

对于Laravel 5:

  1. 将Laravel根文件夹中的server.php重命名为index.php
  2. .htaccess文件从/public目录复制到Laravel根目录 文件夹中。
  3. 那就是它!

答案 1 :(得分:109)

我用2个答案解决了这个问题:

  1. 将server.php重命名为index.php(无修改)
  2. 将.htaccess从公用文件夹复制到根文件夹 (如下面所述的rimon.ekjon)
  3. 将.htaccess改为静态,如下所示:

    RewriteEngine On
    
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)/$ /$1 [L,R=301]
    
    RewriteCond %{REQUEST_URI} !(\.css|\.js|\.png|\.jpg|\.gif|robots\.txt)$ [NC]
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
    
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_URI} !^/public/
    RewriteRule ^(css|js|images)/(.*)$ public/$1/$2 [L,NC]
    

    如果还需要其他静态文件,只需将扩展名添加到之前声明的列表中

答案 2 :(得分:56)

在Laravel 5.5中,在根目录中创建.htacess文件并放置以下代码: - Reference Link

<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

</IfModule>

答案 3 :(得分:41)

从laravel 5网址中删除公众的简便方法。 您只需要从公共目录中剪切index.php和.htaccess并将其粘贴到根目录中,这就是全部 并将index.php中的两行替换为

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

答案 4 :(得分:35)

@ rimon.ekjon说:

  

将Laravel根文件夹中的server.php重命名为index.php,并将.htaccess文件从/ public目录复制到Laravel根文件夹。 - 而已 !! :)

这对我有用。 但是/ public目录中的所有资源文件都找不到并且请求url不起作用,因为我使用了asset()帮助器。

我更改了/Illuminate/Foundation/helpers.php/asset()函数如下:

function asset($path, $secure = null)
{
    return app('url')->asset("public/".$path, $secure);
}

现在一切正常:)

谢谢@ rimon.ekjon和你们所有人。

答案 5 :(得分:22)

1)我还没有找到一种在 L5 中移动公共目录的工作方法。虽然您可以修改引导程序index.php中的某些内容,但是看起来有几个帮助程序函数基于该公共目录存在的假设。老实说,你真的不应该移动公共目录。

2)如果您使用 MAMP ,那么您应该为每个项目创建新的vhost,每个项目都是项目公共目录。创建后,您可以按照以下定义的服务器名称访问每个项目:

http://project1.dev
http://project2.dev

答案 6 :(得分:21)

只需在root上创建 .htaccess 文件并将这些行添加到其中

<IfModule mod_rewrite.c>
    RewriteEngine On

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

就是这样!

以上代码适用于root的public_html文件夹。说你的核心laravel文件应该在public_html文件夹中,如果你的目录看起来像public_html / laravelapp / public,如果你把上面的代码放在laravelapp中,它将无法工作。因此,您必须将所有核心文件复制到public_html中并将.htaccess文件放在那里。

如果您想将代码保存在子目录中,那么您可以创建一个子域,那么此代码也适用于此。

答案 7 :(得分:19)

即使这个帖子中提到的解决方案适用于你们,我也会要求你们不要这样做。原因如下。

您应该将Apache主机根目录指向$LARAVEL_PATH/public目录而不是$LARAVEL_PATH

拥有www主机root而不是项目root的子目录是因为您没有通过Web服务器泄露任何项目文件。

即使所有PHP文件都有文件后缀.php,恶意用户也可以访问您的$LARAVEL_PATH/storage目录及其子目录内容,阅读composer.jsonpackage.json以查找易受攻击的依赖项或读取.env文件等。

如果您在共享主机上运行并且您具有强制public_html,请尝试在该public_html目录之外安装Laravel并删除public_html(如果为空)并将其替换为符号链接{{1或者,如果您希望Laravel实例是$LARAVEL_PATH/public的子目录,请执行相同的操作,但要创建从public_html$LARAVEL_PATH/public的符号链接。

该公共目录是有理由使项目更安全。解决实际问题,不要试图打破这个简单但很好的安全性添加。 :)

答案 8 :(得分:13)

可以在laravel5中删除公开网址。请按照以下步骤操作:

步骤1.从公开复制所有文件并粘贴在 root 目录

步骤2.打开index.php文件    替换为

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

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

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

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

删除所有缓存和Cookie。

答案 9 :(得分:11)

不要!

您绝对不应将您Laravel根文件夹中的server.php重命名为index.php 并将.htaccess文件从/public目录复制到您的Laravel根文件夹中!!

这样,每个人都可以访问您的某些文件(例如.env)。自己尝试。你不要那个!


DO

相反,应在根目录中创建一个.htaccess文件,如下所示:

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

这将以静默方式将您的所有基本URI重写到/public文件夹中。甚至HTTP:Authorization和URI的参数都将以静默方式传递到/public文件夹中。

就是这样!

答案 10 :(得分:10)

假设您将所有其他文件和目录放在名为“locale”的文件夹中。

enter image description here

转到index.php找到这两行:

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

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

并将其更改为:

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

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

答案 11 :(得分:8)

最佳方法: 我不建议删除公开,而是on local computer create a virtual host point to public directoryon remote hosting change public to public_html and point your domain to this directory。原因,你的整个laravel代码将是安全的,因为它的一级到你的公共目录:)

<方法1:

我只需将server.php重命名为index.php即可使用

<方法2:

这适用于所有laravel版本...

这是我的目录结构,

/laravel/
... app
... bootstrap
... public
... etc

按照以下简单步骤

  1. 将所有文件从公共目录移至root / laravel /
  2. 现在,不需要公共目录,因此您可以选择立即将其删除
  3. 现在打开index.php并进行以下替换
  4.   

    要求 DIR 。'/ .. / bootstrap / autoload.php';

      

    要求 DIR 。'/ bootstrap / autoload.php';

      

    $ app = require_once DIR 。'/ .. / bootstrap / start.php';

      

    $ app = require_once DIR 。'/ bootstrap / start.php';

    1. 现在打开bootstrap / paths.php并更改公共目录路径:
    2.   

      'public'=&gt;的 DIR 即可。 '/ .. /公共',

        

      'public'=&gt;的 DIR 即可。 '/ ..',

      就是这样,现在尝试http:// localhost / laravel /

答案 12 :(得分:7)

这是对我来说最好和最短的解决方案,可能是2018年的 对于Laravel 5.5

  1. 只需将您的.htaccess文件从 / public 目录剪切到 root 目录,并使用以下代码替换它:

    <IfModule mod_rewrite.c>
        <IfModule mod_negotiation.c>
           Options -MultiViews
        </IfModule>
    
        RewriteEngine On
    
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteRule ^(.*)/$ /$1 [L,R=301]
    
        RewriteCond %{REQUEST_URI} !(\.css|\.js|\.png|\.jpg|\.gif|robots\.txt)$ [NC]
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteRule ^ server.php [L]
    
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_URI} !^/public/
        RewriteRule ^(css|js|images)/(.*)$ public/$1/$2 [L,NC]
    </IfModule>
    
  2. 只需保存.htaccess文件即可。

  3. 将您的server.php文件重命名为index.php。这都是享受!

答案 13 :(得分:6)

我想加入@Humble Learner并注意到#34; fix&#34;的正确位置。资产的url路径是/Illuminate/Routing/UrlGenerator.php/asset()。

更新方法以匹配:

public function asset($path, $secure = null)
{
    if ($this->isValidUrl($path)) return $path;
    $root = $this->getRootUrl($this->getScheme($secure));
    return $this->removeIndex($root).'/public/'.trim($path, '/');
}

这将修复脚本,样式和图像路径。任何资产路径。

答案 14 :(得分:5)

对于XAMPP用户在不触及laravel默认文件系统的情况下从url中删除public是为您的应用程序设置虚拟主机以执行此操作jsut请按照以下步骤操作

  1. 打开XAMPP控制面板应用程序并停止Apache。请注意,较晚的Windows计算机可能将其作为服务运行,因此请选中Apache模块左侧的框。

  2. 导航至C:/xampp/apache/conf/extra或XAMPP文件所在的位置。

  3. 使用文本编辑器打开名为httpd-vhosts.conf的文件。

  4. 在第19行附近找到#NameVirtualHost *:80并取消注释或删除哈希值。

  5. 在文件的最底部粘贴以下代码:

  6. <VirtualHost *>
        ServerAdmin admin@localhost.com
        DocumentRoot "C:/xampp/htdocs" # change this line with your htdocs folder
        ServerName localhost
        ServerAlias localhost
        <Directory "C:/xampp/htdocs">
            Options Indexes FollowSymLinks Includes ExecCGI
            Order allow,deny
            Allow from all
        </Directory>
    </VirtualHost>
    
    1. 现在,您可以复制并粘贴上面的代码以添加虚拟主机目录。例如,我正在一个名为Eatery Engine的网站上工作,因此下面的代码片段将允许我在本地安装中使用子域:
    2. <VirtualHost eateryengine.dev>
          ServerAdmin admin@localhost.com
          DocumentRoot "C:/xampp/htdocs/eateryengine" # change this line with your htdocs folder
          ServerName eateryengine.dev
          ServerAlias eateryengine.dev
          <Directory "C:/xampp/htdocs/eateryengine">
              Order allow,deny
              Allow from all
          </Directory>
      </VirtualHost>
      
      1. 接下来转到Windows主机文件以编辑您的HOSTS。该文件将位于C:/Windows/System32/drivers/etc/hosts,其中hosts是文件。用记事本打开它。
      2. 查找#localhost名称解析是在DNS本身内处理的。
      3. 127.0.0.1 localhost

        localhost名称解析在DNS本身内处理。

        127.0.0.1       localhost
        127.0.0.1       eateryengine.dev #change to match your Virtual Host.
        127.0.0.1       demo.eateryengine.dev #manually add new sub-domains.
        
        1. 重启Apache并测试所有内容。
        2. 可以找到原始文章here

答案 15 :(得分:4)

总是有理由在Laravel设置中有一个公共文件夹,所有公共相关的东西都应该出现在公共文件夹中,

  

请勿将您的IP地址/域指向Laravel的根文件夹,但将其指向公用文件夹。将服务器Ip指向根文件夹是不安全的,因为除非您在.htaccess中编写限制,否则可以轻松访问其他文件。

只需在.htaccess文件中写入重写条件并安装重写模块并启用重写模块,在路由中添加公共的问题就会得到解决。

答案 16 :(得分:4)

root 目录中创建.htaccess文件,然后将代码放置如下。

<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
</IfModule>

答案 17 :(得分:3)

在根目录中创建.htaccess文件,然后将代码放置如下。

<IfModule mod_rewrite.c>
 #Session timeout

<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

</IfModule>

在/ public目录中创建.htaccess文件,然后将代码放置如下。

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

RewriteEngine On

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

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

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

答案 18 :(得分:2)

我之前看过一些文章并且它工作正常,但真的不知道是否安全

    a. Create new folder local.
    b. Move all project into the local folder expect public folder.
    c. Move all the content of public folder to project root.
    d. Delete the blank public folder
    f. Edit the index file. 

编辑index.php

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

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

答案 19 :(得分:2)

从网址中删除公开内容的4种最佳方法。

如果您使用任何其他技巧从URL中删除了公众,例如将server.php的名称更改为index.php并更改为核心文件路径。显然,不要那样做。那为什么Laravel不提供这样的解决方案,因为这不是这样做的正确方法。

  

1)使用Laravel中的htaccess从URL中删除公共用户

通过在根目录中添加.htaccess文件,您可以在不公开的情况下访问网站

<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

</ifmodule>

  

2)通过在本地创建虚拟主机来删除公共主机

我在这里为Window操作系统提供演示。但是,我将尝试定义一个步骤,以便任何人都可以轻松地遵循该步骤。您也可以针对特定的操作系统在google上进行搜索。

步骤1:转到C:\ Windows \ system32 \ drivers \ etc \以管理员模式打开“主机”文件。

步骤2:向其中添加以下代码。在这里,我为您演示了projectname.local域名演示,您可以随意指定。只需在每个位置使其恒定即可。

127.0.0.1  projectname.local

步骤3:现在,对于xampp用户和wamp用户C:\xampp\apache\conf\extra"C:\wamp\bin\apache\Apache2.4.4\conf\extra"并打开"httpd-vhosts.conf"文件。现在,将以下代码添加到其中。

注释: 根据项目更改文档根目录,还将定义的域名添加到“主机”文件中。

<VirtualHost projectname.local>
      ServerAdmin projectname.local
      DocumentRoot "C:/xampp/htdocs/projectdir"
      ServerName projectname.local
      ErrorLog "logs/projectname.local.log"
      CustomLog "logs/projectname.local.log" common
 </VirtualHost>

步骤4:最后但重要的一步是重新启动Xampp或Wamp并访问 http://projectname.local 之类的URL,Laravel会在没有公共URL的情况下进行响应。


  

3)通过在Laravel中运行命令来删除公共对象

如果您在本地工作,则无需执行任何操作,只需从终端或命令行工具运行以下命令即可。之后,您可以通过命令行通过提供的URL访问您的网站。

   > php artisan serve

如果您想在特定IP上运行项目,则需要运行以下命令。如果您正在LAN上工作,那么如果要允许其他人从本地访问您的网站,则只需在使IP地址按照命令运行之后,通过运行“ ipconfig”来使用命令行检查IP地址即可。

> php artisan serve --host=192.168.0.177

如果您希望在具有特定端口的特定IP上运行项目,则需要执行以下命令。

> php artisan serve --host=192.168.0.177 --port=77

  

4)删除托管服务器或cpanel上的公共主机

enter image description here

项目完成后,您需要将项目托管在服务器上,然后只需将域中的文档根目录设置为公用文件夹。检查以下屏幕截图。

根据屏幕截图,如果您在public_html中没有任何项目文件夹,则只需将文档根目录设置为"public_html/public"

答案 20 :(得分:2)

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

    RewriteEngine On

    # Handle Authorization Header
    RewriteRule ^(.*)$ public/$1 [L]
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

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

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

使用以下命令激活mod_rewrite模块

sudo a2enmod rewrite

并重新启动apache

sudo service apache2 restart

要从.htaccess文件中使用mod_rewrite(这是一种非常常见的用例),请使用编辑默认的VirtualHost

sudo nano /etc/apache2/sites-available/000-default.conf

在“ DocumentRoot / var / www / html”下方添加以下行:

<Directory "/var/www/html">
AllowOverride All
</Directory>

再次重新启动服务器:

sudo service apache2 restart

答案 21 :(得分:2)

首先,您可以使用以下步骤

  

对于Laravel 5:

     

1。。将Laravel根文件夹中的server.php重命名为index.php

     

2。将.htaccess文件从/ public目录复制到Laravel根文件夹。

来源:https://stackoverflow.com/a/28735930

按照这些步骤操作之后,您需要更改所有的CSS和脚本路径,但这会很累人。

解决方案提案:仅需对helpers::asset函数进行少量更改即可。

为此

  1. 打开vendor\laravel\framework\src\Illuminate\Foundation\helpers.php

  2. 转到第130行

  3. "public/".$path而不是$path

    function asset($path, $secure = null){
       return app('url')->asset("public/".$path, $secure);
    }
    

答案 22 :(得分:1)

在根项目文件夹中创建名为.htaccess的新文件,并将以下代码放入其中:

<IfModule mod_rewrite.c>
 #Session timeout

<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

</IfModule>

注意:如果您将server.php更改为index.php,则还应在上面的代码中对其重命名

答案 23 :(得分:1)

我知道很多解决此问题的方法。最好,最简单的解决方案是在 root 目录中添加 .htaccess 文件。

我尝试了为此问题提供的答案,但是在Laravel中使用auth:api Guard遇到了一些问题。

这是更新的解决方案:

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

    RewriteEngine On
    RewriteCond %{HTTP:Authorization} ^(.*)
    RewriteRule .* - [e=HTTP_AUTHORIZATION:%1]

    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
</IfModule>

在您的根目录中创建.htaccess文件,然后添加此代码。一切正常

答案 24 :(得分:1)

问题是,如果您键入/ public,它仍然可以在url中使用,因此我创建了一个修复程序,应将其放在public / index.php

中。
  $uri = urldecode(
     parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH)
  );

  if(stristr($uri, '/public/') == TRUE) {

    if(file_exists(__DIR__.'/public'.$uri)){

    }else{

      $actual_link = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http") . "://{$_SERVER['HTTP_HOST']}{$_SERVER['REQUEST_URI']}";
      $actual_link = str_replace('public/', '',$actual_link);
      header("HTTP/1.0 404 Not Found");
      header("Location: ".$actual_link."");
      exit();
      return false;
   }}

这种和平的代码将从URL中删除public,并给出404,然后在没有public的情况下重定向到该URL

答案 25 :(得分:1)

即使我不建议将Laravel放在根文件夹上,也有一些情况无法避免; 对于那些情况,上述方法不适用于资产,所以我快速修复了htaccess: 将server.php复制到index.php后,编辑.htaccess文件,如下所示:

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

    RewriteEngine On

    ### fix file rewrites on root path ###
    #select file url
    RewriteCond %{REQUEST_URI} ^(.*)$
    #if file exists in /public/<filename>
    RewriteCond %{DOCUMENT_ROOT}/public/$1 -f
    #redirect to /public/<filename>
    RewriteRule ^(.*)$ public/$1 [L]
    ###############

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

    # Handle Front Controller...

    #RewriteCond %{REQUEST_FILENAME} -d # comment this rules or the user will read non-public file and folders!
    #RewriteCond %{REQUEST_FILENAME} -f #
    RewriteRule ^ index.php [L]
</IfModule>

这是我必须做的快速修复,所以欢迎任何人升级它。

答案 26 :(得分:1)

我使用的另一种方法是使用htdocs中的ln命令或www ln projectname/public project创建符号链接(在Linux中,不要知道Win) 因此可以通过localhost / project

访问该站点

答案 27 :(得分:1)

Laravel 5.5

在第一次安装Laravel之后,我遇到了着名的“公共文件夹问题”,我提出了这个解决方案,在我的个人意见中,“更清洁”,然后其他我在网上找到。

成就

  • URI
  • 中没有public个字词
  • 保护.env文件免受好奇的人

只需使用.htaccess和四条简单规则修改mod_rewrite即可完成所有工作。

步骤

  1. .htaccess文件移至主根<{li>中的public/.htaccess
  2. 编辑如下
  3. 我评论了所有内容,所以对于那些从未使用mod_rewrite的人(我不是说我是专家,反之亦然)应该清楚(我希望)。另外,为了理解规则,必须清楚的是,在Laravel中,如果Bill连接到https://example.com,则会加载https://example.com/index.php。此文件只包含命令header("refresh: 5; https://example.com/public/"),该命令将请求发送到https://example.com/public/index.php。第二个index.php负责加载控制器和其他东西。

    # IfModule prevents the server error if the app is moved in an environment which doesn’t support mod_rewrite
    <IfModule mod_rewrite.c>
        <IfModule mod_negotiation.c>
            Options -MultiViews
        </IfModule>
    
        RewriteEngine On
    
        # RULES ORIGINALLY IN public/.htaccess ---
        # Redirect Trailing Slashes If Not A Folder...
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteCond %{REQUEST_URI} (.+)/$
        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}]
        # --- END
    
        # PERSONAL RULES ---
        # All the requests on port 80 are redirected on HTTPS
        RewriteCond %{SERVER_PORT} ^80$
        RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R,L]
    
        # When .env file is requested, server redirects to 404
        RewriteRule ^\.env$ - [R=404,L,NC]
    
        # If the REQUEST_URI is empty (means: http://example.com), it loads /public/index.php
        # N.B.: REQUEST_URI is *never* actually empty, it contains a slash that must be set as match as below
        # .* means: anything can go here at least 0 times (= accepts any sequence of characters, including an empty string)
        RewriteCond %{REQUEST_URI} ^/$
        RewriteRule ^(.*) /public/index.php [L]
    
        # If the current request is asking for a REQUEST_FILENAME that:
        # a) !== existent directory
        # b) !== existent file
        # => if URI !== css||js||images/whatever => server loads /public/index.php, which is responsible to load the app and the related controller
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteRule !^(css|js|images|media)/(.*)$ /public/index.php [L,NC]
    
        # If the current request is asking for a REQUEST_FILENAME that:
        # a) !== existent directory
        # b) !== existent file
        # => if URI == css||js||images[=$1]/whatever[=$2] => server loads the resource at public/$1/$2
        # If R flag is added, the server not only loads the resource at public/$1/$2 but redirects to it
        # e.g.: bamboo.jpg resides in example.com/public/media/bamboo.jpg
        #       Client asks for example.com/media/bamboo.jpg
        #       Without R flag: the URI remains example.com/media/bamboo.jpg and loads the image
        #       With R flag: the server redirects the client to example.com/public/media/bamboo.jpg and loads the image
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteRule ^(css|js|images|media)/(.*)$ /public/$1/$2 [L,NC]
        # --- END
    
    </IfModule>
    

    可以删除以下规则(最初位于public/.htaccess)。事实上,同样的规则在最后两条规则中以更详细的方式阐明。

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

    编辑:我错过了Abhinav Saraswat's solution,他的答案应该是公认的答案。只需一个简单明了的规则,可以将所有流量重定向到公用文件夹,而无需修改任何文件。

答案 28 :(得分:0)

您只需两个简单的步骤即可

  1. 在laravel项目的根目录中重命名server.php文件。

  2. 在根目录上创建一个.htaccess文件,并将以下代码粘贴到其中

Options -MultiViews -Indexes

RewriteEngine On
 

**#Handle Authorization Header**

RewriteCond %{HTTP:Authorization} .

RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

 

**# Redirect Trailing Slashes If Not A Folder...**

RewriteCond %{REQUEST_FILENAME} !-d

RewriteCond %{REQUEST_URI} (.+)/$

RewriteRule ^ %1 [L,R=301]

#Handle Front Controller...

RewriteCond %{REQUEST_URI} !(\.css|\.js|\.png|\.jpg|\.gif|robots\.txt)$ [NC]

RewriteCond %{REQUEST_FILENAME} !-d

RewriteCond %{REQUEST_FILENAME} !-f

RewriteRule ^ index.php [L]


RewriteCond %{REQUEST_FILENAME} !-d

RewriteCond %{REQUEST_FILENAME} !-f

RewriteCond %{REQUEST_URI} !^/public/

RewriteRule ^(css|js|images)/(.*)$ public/$1/$2 [L,NC]

答案 29 :(得分:0)

在您的根目录DIR中创建一个.htaccess文件,然后粘贴以下代码。就这样:P

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

答案 30 :(得分:0)

https://github.com/dipeshsukhia/laravel-remove-public-url

您可以使用此软件包

作曲家需要dipeshsukhia / laravel-remove-public-url --dev

php artisan vendor:publish --tag = LaravelRemovePublicUrl

答案 31 :(得分:0)

您可以先创建虚拟主机,然后在DocumentRoot中指定路径

示例:/var/www/html/YOUR_LARAVEL_DIRECTORY_PATH/public

答案 32 :(得分:0)

请将这些行添加到您的根htaccess文件夹中,该文件夹将完成此工作 在RewriteEngine上 RewriteCond%{REQUEST_URI}!public / RewriteRule(。*)/ public / $ 1 [L]

答案 33 :(得分:0)

将.htaccess文件添加到您的根文件夹,然后粘贴以下代码,并将您的域名替换为您自己的域名

RewriteEngine开启 RewriteCond%{HTTP_HOST} ^(www。)?您的域名$ RewriteCond%{REQUEST_URI}!^ / public /

RewriteCond%{REQUEST_FILENAME}!-f RewriteCond%{REQUEST_FILENAME}!-d

RewriteRule ^(。*)$ / public / $ 1

RewriteCond%{HTTP_HOST} ^(www。)?您的域名$ RewriteRule ^(/)?$ /public/index.php [L]

答案 34 :(得分:0)

您不需要做很多事情,只需在根目录上创建一个.htaccess文件,然后粘贴/保存以下内容;

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

答案 35 :(得分:0)

我在这里尝试了一些解决方案,并发现适用于laravel 5.2的htaccess,如下所示:

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [L,R=301]



RewriteCond %{REQUEST_URI} !(\.css|\.js|\.png|\.jpg|\.gif|robots\.txt)$ [NC]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ server.php

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^/public/
RewriteRule ^(css|js|images)/(.*)$ public/$1/$2 [L,NC]
RewriteRule ^.env - [F,L,NC]
RewriteRule ^app - [F,L,NC]
RewriteRule ^bootstrap - [F,L,NC]
RewriteRule ^config - [F,L,NC]
RewriteRule ^database - [F,L,NC]
RewriteRule ^resources - [F,L,NC]
RewriteRule ^vendor - [F,L,NC]

当您要禁止其他文件或文件夹时,只需添加

RewriteRule ^your_file - [F,L,NC]

答案 36 :(得分:0)

我找到了解决此问题最有效的方法。

只需在 root 文件夹中编辑.htaccess并编写以下代码。没什么

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

<IfModule php7_module>
   php_flag display_errors Off
   php_value max_execution_time 30
   php_value max_input_time 60
   php_value max_input_vars 1000
   php_value memory_limit -1
   php_value post_max_size 8M
   php_value session.gc_maxlifetime 1440
   php_value session.save_path "/var/cpanel/php/sessions/ea-php71"
   php_value upload_max_filesize 2M
   php_flag zlib.output_compression Off
</IfModule>

答案 37 :(得分:0)

您可以使用多种方法从网址中删除公共关键字。

1)如果您正在使用专用主机并且具有root访问权限,则可以使用Virtual Host从URL中删除public关键字。您应该给public提供DocumentRoot路径。因此,这将从公共目录开始索引,并将其从url中删除。

href

2)如果您没有主机的root访问权限,则应在根目录中添加一个新的.htaccess文件,并将代码如下所示

https://www.snopes.com/fact-check/canada-marijuana-federal-debt/

您可以在此处获得更多reference

答案 38 :(得分:0)

第1步: 根目录中的server.php文件重命名为index.php

第2步:.htaccess目录从/public目录复制到根目录

答案 39 :(得分:0)

您只能执行以下两个步骤:

  1. .htaccess文件夹中剪切public并粘贴到根(主文件夹)
  2. 将根目录中的server.php文件重命名为index.php。 (主文件夹)