如何在Laravel中路由到静态文件夹

31

我在我的Laravel网站的/public文件夹中放置了一个文件夹。路径为:

/public/test

"test"文件夹里有一个名为index.html的静态资源,我想从“public”文件夹中加载它(我不想在框架内为此创建视图--这需要解释太多)。

我创建了这样的路由:

Route::get('/test', function() {
  return File::get(public_path() . '/test/index.html');
});

我无法让它工作。 Chrome浏览器显示此页面有一个重定向循环的错误。

我可以通过以下方式访问它:

http://www.example.com/test/index.html

但我不能在任何地方使用 .html 扩展名。该文件必须可见为:

http://www.example.com/test/

我如何在Laravel public文件夹中提供单个HTML页面,而不必使用.html扩展名?

3个回答

31

以前遇到过这个问题,作为一个小技巧,你可以将测试文件夹重命名为其他名称,然后进行更新。

return File::get(public_path() . '/to new folder name/index.html');

关键是您的路由URL与公共文件夹中的文件夹之间没有冲突。


这个方法可行。正如你所说,关键是确保你的路由路径和公共目录中的路径(文件夹)具有不同的名称。感谢你的帮助! - ChiCgi
顺便问一下,你是如何管理测试目录中的资产的? - Harinath R

4
对于静态文件,我认为通过Laravel提供服务是一种浪费资源的方式。
过去曾经出现过一些错误,当尝试访问public中的文件/文件夹时,会创建无限重定向,但我认为最新的Laravel自带的.htaccess已经解决了这些问题(至少在Apache上是如此)。它看起来像这样:
<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>

    RewriteEngine On

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

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

它的意思是:如果请求不是针对现有文件夹,请删除末尾的斜杠(如果有)。如果请求不是针对现有文件夹或现有文件,请加载 Laravel 的 index.php。

然后,我在子目录中添加了一个 .htaccess 文件,以确保设置了 DirectoryIndex,以便在请求目录时默认加载 index.html。


2
一个使用案例是:保护静态内容免受未经身份验证的用户访问。 - David Lartey

2

使用:

return Redirect::to('/test/index');

无论是在路由文件的函数中还是控制器中,都可以完成此操作。

1
那没起作用。我仍然收到重定向循环错误。 - ChiCgi

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