Laravel 4移除URL中的public

17

所以,我在Windows上运行xampp。我目前正在尝试熟悉laravel框架。现在,当我指出这一点时,我该如何直接在根目录中访问我的laravel应用程序/网站?

例如,

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

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

有什么建议吗?


对于 Laravel 5,您可以尝试这个视频教程:https://youtu.be/ybJYyU5FPv4 - MD Singh
看看这个符号链接的解决方案。非常好用 -- https://dev59.com/eF0a5IYBdhLWcg3wTHBt#36766482 - zmonteca
20个回答

14

1
本地测试错误:Symfony\Component\HttpKernel\Exception\NotFoundHttpException - Yousef Altaf

12
以下是我的做法。
  1. 编辑 Windows Hosts 文件 - C:\Windows\System32\drivers\etc\hosts
  2. 编辑 Apache vhosts 文件 - 驱动器:\xampp\apache\conf\extra\httpd-vhosts.conf
  3. 在 laravel/public 文件夹下添加一个 htaccess 文件(如果还没有)
  4. 重新启动 Xampp apache 服务器

由于用户账户控制的缘故,Windows 在尝试编辑 Hosts 文件时可能会遇到麻烦。由于我经常处理各种小型爱好项目,所以不得不经常编辑这个文件,以下是我通常做的事情。

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

    127.0.0.1  laravel.dev
    

    这将告诉Windows在浏览器地址栏输入laravel.dev时将其指向本地主机。

  • 保存文件。
  • 打开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服务器。
  • 打开Web浏览器并在地址栏中输入 - http://laravel.dev
  • 这将带您进入“public”文件夹中的index.php文件。
  • 要进入关于页面,我认为地址应该是http://laravel.dev/about

6
为什么它要如此复杂? - Waseem Senjer
@WaseemAbuSenjer,这并不复杂,我的朋友,这是一个简单的虚拟主机配置。如果您曾经从同一台服务器上运行多个网站,那么您一定使用过它们吧?如果您没有为它们设置虚拟主机,它将不知道如何路由CNAME。 - twigg
谢谢 @HomeSlice,节省了我很多时间。 - Mahendra Jella

10

最佳方法: 我不建议删除 public 目录,而是在本地计算机上创建一个虚拟主机指向 public 目录,并将远程托管中的 public 更改为 public_html,并将您的域名指向此目录。原因是,您的整个 Laravel 代码将更加安全,因为它比 public 目录下深一层 :)

方法一: 我只需将 server.php 重命名为 index.php,它就能工作。

方法二:

这是我的目录结构,

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


有时候这种方法可行,有时候不行,通过这种方式,我们甚至可以摆脱公共目录,这个目录可以用于其他用途,我通常会把公共内容放在公共目录中。 - Wasim A.
你目前的问题与这个问题无关,但是你需要修改你的 .htaccess 文件。 - Wasim A.
为什么你不想改变文档根目录? - Tom Green
1
这实际上是从URL中删除公共工作,现在您可以将公共目录用于自己的目的。您只需更改根目录并将public用作公共目录,例如将HTML模板放在public目录中。 - Wasim A.
请注意,如果您将composer.jsonartisan移动到其他位置,则无法调用它们。我尝试将它们移动到名为“local”的文件夹中,但当我运行php artisancomposer时,会出现“在根目录中找不到文件”的错误。 - Yousef Altaf
显示剩余4条评论

10
/public文件夹的内容下移一层。
需要更新index.php中的包含行,以指向正确的位置。(如果下移了一层,则删除'../')。

1
@HomeSlice的回答比我的好多了。如果你有将来要进行部署的计划,你也需要学习虚拟主机是如何工作的。 - gan
教程中说要在项目内创建另一个文件夹。我认为Wasim的答案更好。 - shasi kanth
对于初学者开发人员来说,学习如何操作他们的主机和虚拟主机文件有很多优势。否则,我认为这三个答案都可以达到相同的效果? - gan
使用此过程可以查看.env文件。 - smartrahat
这可能是IDE上下文相关的问题。并非所有IDE都能正确识别.env文件。 - gan

9
将 Apache 的文档根目录设置为 public 文件夹,而不是 Laravel 文件夹。这是最简单的技术方法,也是生产环境推荐的方法。

这绝对是正确的做法。话虽如此,它并不像其他答案那样简单,并且并没有真正解释如何做到这一点。这不是一个复杂或繁琐的任务,但在不同的环境中有所不同,应该进一步扩展为“被接受”的答案。尽管如此,我还是支持这个答案。 - Shane Lessard
将Apache的文档根目录设置为public文件夹,是的,这终于可以工作了!不要将php_admin_value open_basedirDirectory mark设置为public文件夹,只需设置DocumentRoot即可!非常感谢! - MewX

4

我正在使用L5,这对我很有效:

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

-- 就这样了!!!


3

在 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(端口可能会有所不同)启动本地服务器


3

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

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

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

在这个来源中,你也可以找到另一种方法来实现同样的功能。

更新:最好的方法是更改目录结构,具体请参考来源URL。


3
我也曾经遇到过这个问题,但我找到了一个简单的解决方案,只需要在应用程序的根目录下创建另一个.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 文件夹。
这是我为自己解决问题的方法。
希望能对您有所帮助!
祝好。

3
请将以下代码添加到htaccess文件中。它可能会对您有所帮助。
<IfModule mod_rewrite.c>
RewriteEngine On

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接