【问题标题】:Laravel 4 removing public from URLLaravel 4 从 URL 中删除公共
【发布时间】:2013-03-13 06:10:33
【问题描述】:

所以,我在 Windows 上运行 xampp。我目前正在尝试熟悉 laravel 框架。现在,当那被指出时。我怎样才能直接在根目录中访问我的 laravel 应用程序/网站?

例子,

  • 我现在做的是:localhost/laravel/public/about(查看 关于页面)
  • 我要做的是:localhost/laravel/about

有什么好的解决方案吗?我需要在 laravel 的根文件夹中添加一个 .htacess 文件吗? (不是公开的)。

有什么建议吗?

【问题讨论】:

标签: php frameworks laravel


【解决方案1】:

最简单的方法是在你的 Laravel 根目录中创建 .htaccess 文件,内容如下:

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

它应该很容易重定向。

参考:https://coderwall.com/p/erbaig/laravel-s-htaccess-to-remove-public-from-url

【讨论】:

  • 关于本地测试错误:Symfony \ Component \ HttpKernel \ Exception \ NotFoundHttpException
【解决方案2】:

我是这样做的。

  1. 编辑您的 Windows 主机文件 - C:\Windows\System32\drivers\etc\hosts
  2. 编辑 Apache vhosts 文件 - Drive-Letter:\xampp\apache\conf\extra\httpd-vhosts.conf
  3. 将 htaccess 文件添加到 laravel/public 文件夹(如果还没有的话)
  4. 重启 Xampp apache 服务器

由于用户帐户控制,在尝试编辑 Hosts 文件时,Windows 可以成为真正的 PITA。由于我从事各种小型爱好项目,因此我必须一直编辑此文件,所以我就是这样做的。

  • 安装 PSPad。它加载速度非常快,您可以为文件添加书签以便于加载/编辑。如果您加载我上面提到的两个文件并将工作区另存为新项目,Sublime Text 也可以很好地工作。
  • 右键单击 PSPad(或其他编辑器)程序快捷方式并选择“以管理员身份运行”。除非您这样做,否则您无法保存对 Hosts 文件的更改。
  • 在编辑器中打开 Windows 主机文件。此文件没有文件扩展名,因此您必须在“文件打开”对话框中选择“所有文件”才能看到该文件。
  • 在文件的底部,添加:

    127.0.0.1  laravel.dev
    

    当你在浏览器的地址栏中输入 laravel.dev 时,这会告诉 Windows 将 Web 浏览器指向 localhost。

  • 保存文件。
  • 打开 xampp Apache httpd-vhosts.conf 文件。
  • 在文件底部,添加以下内容:(我假设 xampp 安装在 D: 驱动器的根目录)

    <VirtualHost *:80>
      ServerName laravel.dev
      DocumentRoot "D:/xampp/htdocs/laravel/public"
      <Directory "D:/xampp/htdocs/laravel/public">
      </Directory>
    </VirtualHost>
    
  • 添加一个 htaccess 文件到你的 laravel/public 文件夹(如果它还没有的话)。 我觉得 L4 自带的默认 htaccess 文件是这样的:

    Options -MultiViews
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
    
  • 重新启动您的 xampp apache 服务器。
  • 打开网络浏览器并在地址栏中输入 - http://laravel.dev
  • 这会将您带到“public”文件夹中的 index.php 文件。
  • 要进入“关于”页面,我想地址应该是http://laravel.dev/about

【讨论】:

  • 为什么要这么复杂?
  • @WaseemAbuSenjer 这远非复杂我的朋友,它是一个简单的虚拟主机配置。如果您曾经在同一台服务器上运行过多个网站,那么您一定曾经使用过它们吗?如果您没有为他们设置虚拟主机,它不会知道将 CNAME 路由到哪里?
  • 感谢@HomeSlice 为我节省了很多时间。
【解决方案3】:

/public 文件夹的内容下移一级。

您需要更新 index.php 中的包含行以指向正确的位置。 (如果它下降了一个级别,请删除“../”)。

【讨论】:

  • @HomeSlice 的答案比我的要好得多。如果您要进行部署,则需要了解虚拟主机的工作原理。
  • 教程中说要在项目中创建另一个文件夹。我认为 Wasim 的答案更好。
  • 对于新手开发人员学习如何操作他们的主机和虚拟主机文件有很多好处。否则这 3 个答案和我相信的一样吗?
  • 通过这个过程可以看到.env文件。
  • 这可能是 IDE 上的上下文。并非所有人都能正确识别 .env
【解决方案4】:

最佳方法:我不建议删除公共,而是在本地计算机上创建一个指向公共目录的虚拟主机,并在远程主机上将公共更改为 public_html 并将您的域指向此目录。原因,你的整个 laravel 代码将是安全的,因为它的一级到你的公共目录:)

方法一: 我只是将 server.php 重命名为 index.php 就可以了

方法 2:

这是我的目录结构,

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

按照这些简单的步骤进行

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

需要 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 并更改公共目录路径:

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

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

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

【讨论】:

  • 有时有效,有时无效,通过这种方式我们甚至可以摆脱可用于其他目的的公共目录,然后我通常用于将公共内容放在公共目录中。
  • 我喜欢这个解决方案。但现在的问题是 assets(css,js) 没有被加载。我正在加载像 /assets/css/style.css 这样的资产。那么,我需要进行哪些更改才能使其正常工作?
  • 您当前的问题与这个问题无关 :)...但是您需要修改您的 .htaccess
  • RewriteCond $1 !^(index\.php|web|assets|tfglive|robots\.txt)
  • 它实际上从 URL 中删除了公共工作,现在您可以将公共目录用于您自己的目的。您刚刚更改了 root 并使用 public 作为 public,例如将 html 模板等放在公共目录中。
【解决方案5】:

将 apache 的文档根目录设置为 public 文件夹,而不是 laravel 文件夹。这是最简单的技术,推荐用于生产环境。

【讨论】:

  • 这绝对是正确的做法。也就是说,它并不像其他答案那么简单,也没有真正解释如何做到这一点。这不是一项复杂或不知疲倦的任务,但它在不同的环境中是不同的,应该扩展为“接受”的答案。不过,它得到了我的投票。
  • Set you document root for apache to the public folder,是的,这终于成功了!不要将php_admin_value open_basedirDirectory mark 设置为public 文件夹,只需DocumentRoot!非常感谢!
【解决方案6】:

我正在使用 L5,这对我来说很好用:

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

-- 就是这样!!!

【讨论】:

    【解决方案7】:

    我也一直在努力解决这个问题,但我找到了一个简单的解决方案,只需要您在应用程序的根目录中创建另一个 .htaccess。

    .htaccess 本身应该包含这个:

    RewriteEngine On
    
    RewriteCond %{HTTP_HOST} ^{yoursite}.{extension} [NC]
    RewriteRule (.*) http://www.{yoursite}.{extension}/$1 [R=301,L]
    
    RewriteCond %{REQUEST_URI} !public/
    RewriteRule (.*) /public/$1 [L]
    

    整个系统继续工作,但它重定向到 /public 文件夹。

    这就是我自己解决问题的方法。

    希望对你有帮助!

    干杯。

    【讨论】:

      【解决方案8】:

      将以下代码添加到 htaccess 文件中。它可能对你有帮助。

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

      【讨论】:

        【解决方案9】:

        在您的 .htaccess 中添加以下代码(如果不存在,请在 laravel 根目录上创建一个 .htaccess)

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

        来源:http://tutsnare.com/remove-public-from-url-laravel/

        在 Source,您还可以使用另一种方法来做同样的事情。

        更新:首选方法是更改​​在源 URL 中解释的目录结构。

        【讨论】:

          【解决方案10】:

          只是我在 laravel 5 中所做的简单步骤 像这样在 laravel 文件夹中制作 .htaccess

          <IfModule mod_rewrite.c>
              <IfModule mod_negotiation.c>
                  Options -MultiViews
              </IfModule>
          
              RewriteEngine On
              # Redirect Trailing Slashes...
              RewriteRule ^(.*)/$ /$1 [L,R=301]
          
              # Handle Front Controller...
              RewriteCond %{REQUEST_FILENAME} !-d
              RewriteCond %{REQUEST_FILENAME} !-f
              RewriteRule ^ ./index.php [L]
          </IfModule>
          

          然后将您的 server.php 重命名为 index.php

          它会起作用

          或者如果你只是做本地开发

          运行这个命令php artisan serve

          它将在localhost:8000 启动本地服务器(端口可能不同)

          【讨论】:

            【解决方案11】:

            您可以使用符号链接或编辑httpd.conf 文件。

            检查我的answer 以了解另一个类似问题。希望对您有所帮助。

            【讨论】:

            • 一些托管公司不允许开发者更改httpd.conf
            • @GilbertoAlbino OP 提到在本地机器上运行 Laravel,而不是在托管服务器上。无论如何,编辑 httpd.conf 文件是我的建议之一。
            【解决方案12】:

            如果您不想承受配置 .htaccess 文件的压力, 你可以通过这样做来使用 PHP 内置服务器:

            1. 从您的命令实用程序,cd 进入laravel\public
            2. 运行:php -S localhost:8000

            在您可以通过以下方式访问您的网站后:

            http:://localhost:8000

            无需附加public即可工作

            查看官方手册了解更多: http://php.net/manual/en/features.commandline.webserver.php

            【讨论】:

              【解决方案13】:

              使用 cmd 进入项目文件夹并输入“php artisan serve”。 现在导航到:localhost:8000

              【讨论】:

                【解决方案14】:

                我发现 geart flow 可以在本地使用 laravel。

                你可以做的是稍微配置一下xampp。在您的 xamp 的 httpd.conf 文件中,您必须找到文档 DocumentRoot&lt;Directory&gt;。将根目录更改为您的 laravel 公共文件夹并重新启动 apache。从什么时候开始,您只需键入 localhost 即可访问您的项目。现在,如果您愿意,您可以更改主机文件并重写本地 dns,例如:127.0.0.1 example.laravel.com 现在您可以使用真实 url 访问您的项目。它可能看起来有点复杂,但事实并非如此。

                替代方案是php artisan serve。您可以在不同的端口和重写主机文件时启动服务器。

                您可以添加一些功能来进一步改进您的工作流程,例如vagrantngrok。您可以分享您的项目以进行现场演示(此处可能存在速度问题)。

                【讨论】:

                  【解决方案15】:

                  需要在larvel4应用中移除公共段

                  Laravel 4 要求您将应用代码放在比 Web 根目录高一级的位置,这会导致一些开发人员遇到问题,他们被困在共享主机上并且不允许这样的设置。实际上很容易绕过它。我读到一些 L4 特定的包在这样的设置上可能会出现问题,但我还没有遇到任何包的类似问题。

                  所以首先在你喜欢的地方安装 L4。我喜欢 Niall 写的关于保持基本 L4 应用程序最新的文章,所以去看看:安装和更新 Laravel 4

                  我发现这个例子只需要简单地克隆 repo 就足够了(假设你已经全局安装了 composer,如果没有,请转到 http://getcomposer.org/):

                  git clone -b develop git://github.com/laravel/laravel.git app_name
                  

                  php 作曲家安装

                  请注意,我们正在克隆开发分支,因为此时 L4 仍处于测试阶段。

                  因此,要从您的 URL 中删除“公共”部分,只需将所有文件和文件夹从公共移动到您的应用根目录,您最终会得到如下文件夹结构:

                  /app
                  /bootstrap
                  /packages (copied from /public)
                  /vendor
                  .htaccess (copied from /public)
                  artisan
                  composer.json
                  favicon.ico (copied from /public)
                  index.php (copied from /public)
                  robots.txt (copied from /public)
                  server.php
                  

                  现在我们需要在 index.php 中编辑我们的路径:

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

                  然后在 /bootstrap/paths.php 文件中设置公共目录:

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

                  这是我的建议

                  【讨论】:

                    【解决方案16】:

                    你需要做以下事情:

                    1. 首先将公共目录的所有内容复制到您的根目录中,即,将公共文件夹 1 的内容上移。

                    2. 修改index.php的内容

                    来自 =>

                    require __DIR__ . "/../bootstrap/autoload";
                    $app = require_once __DIR__ . "/../boostrap/start.php"
                    

                    到 =>

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

                    还有 bootstrap/paths.php 的内容

                    来自 => 'public' =&gt; __DIR__.'/../../',

                    致 => 'public' =&gt; __DIR__.'/..',

                    3.最后在你的根目录下创建.htaccess文件并写入。

                    <IfModule mod_rewrite.c>
                        <IfModule mod_negotiation.c>
                            Options -MultiViews
                        </IfModule>
                        RewriteEngine On
                        RewriteRule ^(.*)/$ /$1 [L,R=301]
                        RewriteCond %{REQUEST_FILENAME} !-d
                        RewriteCond %{REQUEST_FILENAME} !-f
                        RewriteRule ^ index.php [L]
                    </IfModule>
                    

                    【讨论】:

                      【解决方案17】:

                      简单的步骤:

                      1. server.php(在根目录中)重命名为index.php
                      2. .htaccess文件从公共目录复制到根目录

                      【讨论】:

                        【解决方案18】:

                        server.php 重命名为index.php 并从/public 复制.htaccess 是正确的方法。 如果您将您的应用发送到网上,只需将 DocumentRoot 更改为 public 路径即可。

                        【讨论】:

                          【解决方案19】:

                          如果你从 url 中删除 public 首先将 index.php 和 .htaccess 文件从 public 文件夹移动到 laravel 的根目录并更改 index.php 文件

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

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

                          然后运行程序

                          【讨论】:

                            【解决方案20】:

                            这个问题已经被问过很多次了。我有同样的问题。我通过使用 vhosts 和 .htaccess 文件解决了这个问题。我想写关于 Windows 上的 XAMPP 和 Ubuntu 上的 LAMP 安装的解决方案。我在windows上的配置: 我的目标是通过输入下面的 uri 来访问我的应用程序

                            http://localhost/subdir
                            
                            c:\xampp\htdocs\subdir\ # this was laravel root directory
                            c:\xampp\apache\conf\extra\httpd-vhosts.conf # this virtual hosts file
                            

                            我使用了 Laravel 网站上的原始 .htaccess 文件(记住 .htaccess 文件必须在公共目录中),但我只添加了一行

                            RewriteBase /subdir (just below RewriteEngine On)
                            

                            另外,在 httpd-vhosts 文件中你应该像这样添加你的子目录别名:

                            Alias /subdir
                            "C:/xampp/htdocs/subdir/public"
                            <Directory "C:/xampp/htdocs/subdir/public">
                              Order allow,deny
                              Allow from all
                              Options All
                              AllowOverride All
                              Require all granted
                            </Directory>
                            

                            希望我的解释一切都清楚。这个答案可以很容易地应用在基于 unix 的系统上。

                            【讨论】:

                              猜你喜欢
                              • 2015-06-09
                              • 2017-02-27
                              • 2016-06-09
                              • 2019-03-30
                              • 2015-04-06
                              • 2021-08-08
                              • 1970-01-01
                              • 2020-08-31
                              相关资源
                              最近更新 更多