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

TH1*_*981 3 php laravel laravel-routing

我正在使用Laravel并在我的公共目录中有一个上传文件的文件夹uploads.

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

Route::get('uploads', function(){
    return Redirect::to('/');
});
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为我在浏览器中遇到重定向循环错误.我把它缩小到目录存在的事实 - 如果我删除/重命名目录,路由按预期工作.

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

ruu*_*ter 12

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

RewriteRule ^(.*)/$ $1 [L,R=301]
Run Code Online (Sandbox Code Playgroud)

将修复驻留在公用文件夹中的文件夹上的重定向循环问题.
然而,这会让你退后一步,因为现在你没有尾随斜杠重定向.如果不是现有目录,

那么你可以做的是重定向尾部斜杠,如下所示:

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

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

RewriteCond %{REQUEST_FILENAME} !-f
#RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [L]
Run Code Online (Sandbox Code Playgroud)

这个块说:"将所有内容重定向到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>
Run Code Online (Sandbox Code Playgroud)