Laravel 5 – 从 URL 中删除 Public

Laravel 5 – Remove Public from URL

我知道这是一个非常受欢迎的问题,但我一直无法找到 Laravel 5 的有效解决方案。很长一段时间以来,我一直在尝试从 Codeigniter 迁移,但这个复杂的安装过程一直让我望而却步。

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

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

我试过 .htaccess mod_rewrite 方法

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

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

前段时间尝试L4的时候,使用了将public文件夹的内容移动到根目录下的方法。 L5的结构完全不同,按照相同的步骤完全破坏了Laravel(服务器只会return一个空白页)。

在以下开发环境中是否有删除 'public' 的合适方法:

  1. 适用于 L5
  2. 让我可以轻松地在项目之间切换(我通常同时处理 2 或 3 个项目)。

谢谢

** 我正在使用 MAMP 和 PHP 5.6.2

1) 我还没有找到在L5中移动public目录的工作方法。虽然您可以修改 bootstrap index.php 中的某些内容,但似乎有几个辅助函数是基于 public 目录存在的假设。老实说,您真的不应该移动 public 目录。

2) 如果您使用 MAMP 那么您应该为每个项目创建新的虚拟主机,每个虚拟主机服务于该项目 public 目录。创建后,您可以通过定义的服务器名称访问每个项目,如下所示:

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

可以在 laravel5 中删除 public url。请按照以下步骤操作:

步骤1.copy 来自public 的所有文件并粘贴到root 目录

步骤2.openindex.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。

假设您将所有其他文件和目录放在名为 'locale'.

的文件夹中

只需转到 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';

对于Laravel 5:

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

就是这样!

从 laravel 5 url 中删除 public 的简单方法。 您只需要从 public 目录中剪切 index.php 和 .htaccess 并将其粘贴到根目录中,仅此而已 并将 index.php 中的两行替换为

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

注意:以上方法仅适用于初学者,因为他们在设置虚拟主机时可能会遇到问题,最好的解决方案是在本地机器上设置虚拟主机并指向它到项目的 public 目录。

@rimon.ekjon 说:

Rename the server.php in the your Laravel root folder to index.php and copy the .htaccess file from /public directory to your Laravel root folder. -- Thats it !! :)

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

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

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

现在一切正常:)

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

2020 年作者更新

不推荐此答案。 相反,建议处理 .htaccess 文件。

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

  1. 将 server.php 重命名为 index.php(无修改)
  2. 将 .htaccess 从 public 文件夹复制到根文件夹 (就像下面说的rimon.ekjon)
  3. 为静态改变 .htaccess 如下:

    RewriteEngine On
    
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)/$ / [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// [L,NC]
    

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

我想向@Humble Learner 添加并注意 "fix" 资产的 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, '/');
}

这将修复脚本、样式和图像路径。资产路径的任何东西。

对于 XAMPP 用户从 url 中删除 public 而不触及 laravel 默认文件系统是为您的应用程序设置一个虚拟主机来执行此操作,只需按照以下步骤操作

  1. 打开 XAMPP 控制面板应用程序并停止 Apache。请注意,后期 Windows 机器可能 运行 它作为一项服务,因此请选中 Apache 模块左侧的框。

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

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

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

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

<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 的网站上工作,因此以下代码片段将允许我在本地安装中使用子域:
<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 主机文件以编辑您的主机。该文件将位于 C:/Windows/System32/drivers/etc/hosts,其中 hosts 是文件。用记事本打开。
  2. 寻找 #localhost 名称解析是在 DNS 本身内处理的。

127.0.0.1 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 并测试所有内容。

原文可见here

最佳方法: 我不建议删除 public,而是 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 代码将是安全的,因为它向下一层到您的 public 目录 :)

方法一:

我只是将 server.php 重命名为 index.php 并且有效

方法二:

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

这是我的目录结构,

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

按照这些简单的步骤操作

  1. 将所有 文件从 public 目录移动到根 /laravel/
  2. 现在,不需要 public 目录,因此您可以选择现在删除它
  3. 现在打开 index.php 并进行以下替换

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

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

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

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

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

'public' => DIR.'/../public',

'public' => DIR.'/..',

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

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

访问该站点

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

    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';

在 Laravel 设置中有一个 public 文件夹总是有原因的,所有 public 相关的东西都应该存在于 public 文件夹中,

Don't Point your ip address/domain to the Laravel's root folder but point it to the public folder. It is unsafe pointing the server Ip to the root folder., because unless you write restrictions in .htaccess, one can easily access the other files.,

只需在.htaccess文件中写入rewrite条件,安装rewrite模块并启用rewrite模块,路由中添加public的问题就解决了。

即使我不建议将 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/ -f
    #redirect to /public/<filename>
    RewriteRule ^(.*)$ public/ [L]
    ###############

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)/$ / [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>

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

只需在根目录下创建 .htaccess 文件并将这些行添加到其中

<IfModule mod_rewrite.c>
    RewriteEngine On

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

就是这样!

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

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

Laravel 5.5

第一次安装 Laravel 后,我遇到了著名的 "public folder problem",我想出了这个解决方案,在我的 个人意见中 , 是 "cleaner" 然后是我在网上找到的其他人。


成就

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

只需使用 mod_rewrite 和四个简单规则编辑 .htaccess 即可完成所有操作。


步骤

  1. .htaccess文件移动到主根public/.htaccess
  2. 编辑如下

我评论了所有内容,因此(我希望)那些从未使用过 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[=]/whatever[=] => server loads the resource at public//
    # If R flag is added, the server not only loads the resource at public// 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// [L,NC]
    # --- END

</IfModule>

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

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

编辑: 我错过了 ,他的回答应该被接受。只需一条简单明了的规则,无需修改任何文件即可将所有流量重定向到 public 文件夹。

In Laravel 5.5 在您的根目录中创建 .htaccess 文件并放置以下代码:- 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 ^ ^ [N]

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

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

</IfModule>

这是截至 2018 年 5 月最适合我的最短解决方案 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 ^(.*)/$ / [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// [L,NC]
    </IfModule>
    
  2. 只需保存.htaccess文件即可。

  3. 将您的 server.php 文件重命名为 index.php。就这些了尽情享受吧!

首先你可以使用这个步骤

For Laravel 5:

1. Rename server.php in your Laravel root folder to index.php

2. Copy the .htaccess file from /public directory to your Laravel root folder.

来源:

完成这些步骤后,您需要更改所有 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);
    }
    


请注意 在使用 Docker 服务 Laravel 项目时:您不需要执行任何这些操作。 仅当您网站的根目录(或更常见:public_html)是您的 Laravel 项目时才使用此选项(当您使用 Docker).

不要!

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

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


相反,您应该像这样在根目录中创建一个 .htaccess 文件:

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

这将以静默方式将所有基本 URI 重写到 /public 文件夹中。甚至所有 Headers, for example the HTTP Authorization Header 和所有可选 URI 参数也将静默传递到 /public 文件夹。

就这些

您可以使用多种方法从 url 中删除 public 关键字。

1) 如果您使用的是专用主机并且您有 root 访问权限,那么您可以使用虚拟主机从 url 中删除 public 关键字。您应该给 DocumentRoot 路径 public。所以这将从 public 目录开始索引并将其从 url.

中删除
<VirtualHost *:80>
    ServerAdmin info@example.com
    ServerName example.com
    ServerAlias www.example.com
    DocumentRoot /var/www/html/{yoursourcedirectory}/public

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

2) 如果您没有主机的 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 ^ ^ [N]

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

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ server.php
</IfModule>

您可以在此处获得更多reference

我找到了这个问题最有效的解决方案。

只需在root 文件夹中编辑您的.htaccess 并编写以下代码。没有其他要求

RewriteEngine on
RewriteCond %{REQUEST_URI} !^public
RewriteRule ^(.*)$ public/ [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>

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 ^ ^ [N]

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

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ server.php
</IfModule>

请将这些行添加到您的根 .htaccess 文件中,该文件隐藏 /public 并重定向到所有没有 public

的 URL
RewriteEngine on
RewriteCond %{REQUEST_URI} !public/
RewriteRule (.*) /public/ [L]
<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews -Indexes
    </IfModule>

    RewriteEngine On

    # Handle Authorization Header
    RewriteRule ^(.*)$ public/ [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

从 URL.

中删除 public 的 4 种最佳方法

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

1) Remove public from URL using htaccess in Laravel

通过在根目录下添加.htaccess文件,无需public

即可访问网站
<ifmodule mod_rewrite.c>
    <ifmodule mod_negotiation.c>
        Options -MultiViews
    </ifmodule>

    RewriteEngine On

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

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

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

</ifmodule>

2) Remove the public by creating a virtual host in your local

我在这里演示 Window 操作系统。但我会尝试定义一个步骤,以便任何人都可以轻松地遵循该步骤。您还可以针对特定操作系统研究 google。

第一步:到C:\Windows\system32\drivers\etc\以管理员模式打开"hosts"文件。

第二步:在其中添加以下代码。这里给大家演示一个projectname.local域名demo,大家可以随意指定。只是让它在每个地方都保持不变。

127.0.0.1  projectname.local

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

注意: 根据您的项目更改文档根目录,并将您定义的域名添加到 "hosts" 文件中。

<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 并访问 url,例如 http://projectname.local 和您的Laravel 将在没有 public URL 的情况下响应。


3) Remove the public by running the command in Laravel

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

   > php artisan serve

如果您愿意 运行 您的项目在特定 IP 上,那么您需要 运行 以下命令。如果您在 LAN 上工作,那么如果您想让其他人从本地访问您的网站,那么您只需要在获取 IP 地址后使用命令行 运行ning "ipconfig" 检查您的 IP 地址 运行 遵循命令。

> php artisan serve --host=192.168.0.177

如果您愿意 运行 您的项目在具有特定端口的特定 IP 上,那么您需要执行以下命令。

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

4) Remove the public on the hosted server or on the cpanel

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

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

引用自here

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

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ / [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// [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]

您不需要做太多,只需在根目录和下面的 paste/save 创建一个 .htaccess 文件即可;

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

问题是,如果您键入 /public,它在 url 中仍然可用,因此我创建了一个应该放在 public/index.[=16 中的修复程序=]

  $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,然后重定向到 url 而没有 public

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

重写引擎开启 RewriteCond %{HTTP_HOST} ^(www.)?你的域名$ RewriteCond %{REQUEST_URI} !^/public/

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

重写规则 ^(.*)$ /public/$1

RewriteCond %{HTTP_HOST} ^(www.)?你的域名$ 重写规则 ^(/)?$ /public/index.php [L]

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

我尝试了我们为这个问题提供的答案,但是我在 Laravel 中遇到了 auth:api 守卫的一些问题。

这是更新后的解决方案:

<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 ^ ^ [N]

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

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ server.php
</IfModule>

在您的根目录中创建 .htaccess 文件并添加此代码。一切顺利

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

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

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

你可以使用这个包

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

php artisan vendor:publish --tag=LaravelRemovePublicUrl

在根目录中创建 .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 ^ ^ [N]

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

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>

只需简单两步即可完成

  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// [L,NC]

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

RewriteEngine On

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

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

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

在根项目文件夹中创建名为 .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 ^ ^ [N]

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

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

</IfModule>

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