Laravel公共目录列表重定向循环错误 - 需要优雅地失败

时间:2014-08-13 21:15:21

标签: php laravel laravel-routing

II使用Laravel并在我的公共目录中有一个名为uploads的上传文件的文件夹。

我想确保没有人可以意外导航到该目录的根目录,所以我添加了一条路线如下:

Route::get('uploads', function(){
    return Redirect::to('/');
});

由于我在浏览器中遇到重定向循环错误,因此无法正常工作。我把它缩小到目录存在的事实 - 如果我删除/重命名目录,路由按预期工作。

这让我觉得有更好的办法来解决这个问题。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:12)

显然,重定向循环似乎来自尾部斜杠重定向,在Laravel默认.htaccess文件中定义。删除以下行:

RewriteRule ^(.*)/$ $1 [L,R=301]

将修复驻留在公用文件夹中的文件夹上的重定向循环问题 然而,这会让你退后一步,因为现在你没有尾部斜线重定向。

Insted你可以做的只是重定向尾随斜杠如果不是现有目录,就像这样:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ $1 [L,R=301]

您可能要做的第二件事是从Laravel默认.htaccess文件的最后一个块中删除相同的条件:

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

这个块说:“将所有内容重定向到index.php文件,现有文件和文件夹除外。”我注释掉了目录条件,因为我不希望人们在我的公共文件夹中访问文件夹索引。如果你这样做,请取消注释。
这是我完整的.htaccess文件:

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>

    RewriteEngine On
    RewriteBase /

    # Redirect trailing slashes
    # Only if not existing directory. This prevents redirect loop.
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)/$ $1 [L,R=301]

    # Redirect everything to index.php if not existing file like css or jpg
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]

</IfModule>

答案 1 :(得分:0)

您认为可以访问此目录是正确的。如果您已经检查过但不是,则可能需要按照此步骤操作,以防您决定切换到默认情况下未隐藏它的主机。

只需将此添加到.htaccess

即可
    Options -Indexes