【问题标题】:Routing Apache ErrorDocument to a Laravel route将 Apache ErrorDocument 路由到 Laravel 路由
【发布时间】:2015-10-20 10:55:18
【问题描述】:

我正在使用 Laravel 5.1。我的.htaccess 文件中有这个(与默认值相比,这些只是文件中的更改):

Options -Indexes
ErrorDocument 403 /error-403

我的public/ 目录中还有一个js/ 目录。

当我尝试在浏览器中访问/js/ 目录时,我没有打开/error-403 路由,正如我所料。相反,我触发了 Laravel 的 404 HTTP 错误处理程序(我从 Laravel 获得了 404 页面),但我不明白为什么。

当我直接在浏览器中打开/error-403 时,相应的视图可以正常打开。以下是我在 PHP 中为这两个请求看到的一些有趣的服务器变量。


/error-403:

"REDIRECT_STATUS" => "200"
"REDIRECT_URL" => "/error-403"
"REQUEST_METHOD" => "GET"
"REQUEST_URI" => "/error-403"

/js/:

"REDIRECT_REDIRECT_REQUEST_METHOD" => "GET"
"REDIRECT_REDIRECT_STATUS" => "403"
"REDIRECT_STATUS" => "403"
"REDIRECT_URL" => "/error-403"
"REQUEST_METHOD" => "GET"
"REQUEST_URI" => "/js/"

在我看来,Apache 似乎将请求重定向到 Laravel,但 Laravel 并没有选择 URL /error-403,而是选择了不存在路由的 URL /js/,然后抛出 404。

有没有其他人遇到过类似的问题?我在这里想念什么?如何设置 Laravel 以便 Apache(及其 ErrorDocument 语句)重定向到 Laravel 中定义的路由?而“如何”,我的意思是我怎样才能以适当的方式做到这一点,所以它不是一个黑客。我想我可以创建一个自定义中间件来检查这些服务器变量并更正路由,但这似乎很脏,我不知道我是否在这里遗漏了什么。

【问题讨论】:

    标签: php apache .htaccess laravel-5


    【解决方案1】:

    如果有人感兴趣,我设法克服了这个问题。

    我注意到问题出在Symfony\Component\HttpFoundation\Request::prepareRequestUri()。在这种方法中,只考虑了REQUEST_URI,从不考虑REDIRECT_URL。

    Laravel 使用Illuminate\Http\Request,它是前面提到的一个子类。如果您查看服务容器,您将看到此类的一个实例。所以我需要做的是扩展这个类并覆盖这个方法。所以我这样做了:

    <?php
    
    namespace App\Http;
    
    use Illuminate\Http\Request as LaravelRequest;
    
    class Request extends LaravelRequest
    {
        protected function prepareRequestUri()
        {
            if ((int) $this->server->get('REDIRECT_STATUS', '200') >= 400 && $this->server->has('REDIRECT_URL')) {
                $requestUri = $this->server->get('REDIRECT_URL');
                $this->server->set('REQUEST_URI', $requestUri);
                return $requestUri;
            }
    
            return parent::prepareRequestUri();
        }
    }
    

    所以,如果REDIRECT_STATUS超过400且REDIRECT_URI存在,就会被使用,否则会回退到框架默认逻辑。

    最后,我必须指示框架使用我的实现而不是它自己的实现。我通过编辑public/index.php 并将Illuminate\Http\Request::capture() 替换为App\Http\Request::capture() 来做到这一点。

    现在一切正常,至少据我所知。 Laravel 正在正确呈现 Apache 错误文档。

    【讨论】:

      猜你喜欢
      • 2020-10-17
      • 2015-07-30
      • 1970-01-01
      • 2014-06-29
      • 2016-08-16
      • 2016-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多