Laravel 从 /public 文件夹外的 ROOT 调用。获取 NotFoundHttpException

Posted

技术标签:

【中文标题】Laravel 从 /public 文件夹外的 ROOT 调用。获取 NotFoundHttpException【英文标题】:Laravel called from ROOT outsite the /public folder. Getting NotFoundHttpException 【发布时间】:2015-01-07 09:45:59 【问题描述】:

我已经通过网络搜索来解决我的问题,但没有一个解决方案适合我,所以在与路由模块苦苦挣扎几个小时后,我决定向你寻求帮助。

问题

我无法从 /public 目录外部访问 Laravel 应用程序。我需要在我的浏览器中输入 localhost\projects\laravel\public,但我想要的是使用带有 /public 的 URL。主要原因是因为我使用共享主机并且无法访问 apache 配置文件,所以我无法创建 vhost。

背景

我已经在 **c:\xampp\htdocs\projects\laravel** 下手动安装了 Laravel 框架,并使用 composer 为我完成了剩下的工作。

路由已设置为:Route::get('/', 'HomeController@showWelcome');

在我的项目根目录 **c:\xampp\htdocs\projects\laravel** 我已经放置了一个 .htacces 文件,内容如下:

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

    <IfModule !mod_rewrite.c>    
        ErrorDocument 404 /index.php
    </IfModule>

在我的应用程序根目录 c:\xampp\htdocs\projects\laravel\public 我有 .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>

当我输入:localhost\projects\laravel\ 我得到了 NotFoundHttpException

当我输入时:localhost\projects\laravel\public 我有欢迎页面

任何帮助将不胜感激,谢谢。

【问题讨论】:

public 文件夹中的 index.php 文件是启动应用程序的文件 将 index.php 从 /public 移动到项目 ROOT 并将其中的路径更改为正确的路径将导致同样的问题。应用程序运行但抛出 NotFoundHttpException。路由配置有问题。 @tetsujinsan 你的主机是什么?你检查过php版本吗? PHP 版本 5.5.9,我开启了 mod_rewrite。 【参考方案1】:

如果您想在 uri 上不公开,请使用 laravel 根目录中的作曲家。使用命令 php artisan serve 并从浏览器浏览 localhost:8000。它会将您带到主页。

【讨论】:

我没有问题用虚拟主机配置我的本地机器。问题是当我将项目部署到共享主机时,所有 URL 都需要 public\previx,我不希望这样 试试这个为您的 ht 访问选项 +FollowSymLinks RewriteEngine On RewriteCond %REQUEST_FILENAME !-d RewriteCond %REQUEST_FILENAME !-f RewriteRule ^ index.php [L] AddType application/x-httpd- php53 .php 不幸的是,这不起作用。我假设 Htaccess 工作正常,因为应用程序已启动但路由无法识别,因此在这种情况下存在一些不正确的情况:Route::get('/', 'HomeController@showWelcome'); 如何在主机上安装 laravel?您从 public_html 文件夹中移出系统文件?并将公用文件夹中的内容仅保留在您的 Web 文件夹中?如果是,您是否在线为您的 index.php 设置了路径 require DIR.'/../bootstrap/autoload.php'; & $app = require_once DIR.'/../bootstrap/start.php';纠正一个? 这样的。如果没有正确的路径,我会收到致命错误,但应用程序会运行并引发异常。 Laravel 中的所有文件都已复制到 public_html 文件夹中。结构如下:public_html/app, public_html/bootstrap (...) public_html/public。最后一个包含 index.php。所以我在 public_html 和 \public 文件夹中都有 htaccess 文件。请参阅主帖以查看此文件的配置。【参考方案2】:

你从哪里得到这条线的?

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

它不是 Laravel 的一部分。尝试删除它或 Laravel 根目录中的整个 .htaccess 文件。

【讨论】:

【参考方案3】:

我终于让这个东西工作了。有两种解决方案。

    需要将所有公共内容升级 其次需要对您的共享主机目录根结构稍作更改 - 如果允许

解决方案 #1

@Wasim 在此线程中发布了第一个对我有用但我不想实现的功能:Laravel 4 removing public from URL 该解决方案未保存,因为内容核心结构与应用程序本身位于同一目录中。这可能会在未来的实施中引起一些问题。

您需要将 public/ 文件夹中的所有内容上一级移动到项目 ROOT 目录中,然后替换 index.php 中的内部路径> 正确的文件。出于安全原因,这个 .htaccess 文件需要放到项目 ROOT 目录中

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

上述修改后的 Laravel 结构可以上传到您的共享虚拟主机,并且应用程序应该在您的 http 地址中使用我们的 /public 运行。


解决方案 2(无法访问共享主机上的 http.conf 文件)

此解决方案不要求您将 /public 文件夹的内容上移一级,但要求您对共享主机中的 ../ROOT 目录具有读写权限(../ROOT目录主要包含public_htmlpublic_ftp等文件夹)。

您需要将 Laravel scructure 移动到 ../ROOT 目录中,如下所示:

app/
bootstrap/
vendors/
public_html/
public_ftp/
(...)

/public 文件夹中的文件转到 public_html

public_html/index.php
public_hmtl/.htaccess
public_html/packages/
(...)

然后需要修改 /bootstrap/paths.php 以使用“公钥”:

'public' => DIR.'/../public' 到 'public' => DIR.'/../public_html强>'

如果有人遇到类似问题并且此解决方案不起作用,请告诉我,谢谢。

【讨论】:

以上是关于Laravel 从 /public 文件夹外的 ROOT 调用。获取 NotFoundHttpException的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 工匠制作:资源文件夹外的组件

如何以正确的方式从 laravel 5 url 重写或删除 public?

从 laravel 控制器中删除 public 后不起作用?

Laravel 5 & Vue 组件 – 从 URL 中移除 Public

Laravel 框架外的 Artisan::call()

试图从 url Laravel 中删除 public