PHP:生成 Laravel Paginator 安全(HTTPS)链接

PHP: Generate Laravel Paginator Secure (HTTPS) Links

我正在开发一个使用 Laravel 4.2 over HTTPS 的应用程序,带有安全路由和重定向。我正在使用Paginator对结果进行分页,但是视图中呈现的链接指向http页面,我们如何强制Paginator生成https链接?


我今天遇到了这个问题,并找到了这个全局解决方案。

在您的 AppServiceProvider::boot 方法中,您可以添加以下内容以在分页链接上强制 https

1
$this->app['request']->server->set('HTTPS','on');


如果您当前的页面是通过 HTTPS 提供的,那么生成的分页 URL 应该使用该架构。

但是,如果您使用的代理没有传递正确的标头,则负责确定连接是否安全的 Request 类可能不会报告它。要确定请求是否被检测为安全,请使用 Request::secure()。如果返回 false,请尝试使用 Laravel 可信代理。

如果这不起作用,您可以使用 setBaseUrl 强制分页 URL,如下所示:

1
2
$results->paginate();
$results->setBaseUrl('https://' . Request::getHttpHost() . '/' . Request::path());


app/helpers/ 中添加自定义演示者 ZurbPresenter.php(如果其路径包含在 ClassLoader::addDirectories() 中,您可以将其放在其他目录中):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
<?php
class ZurbPresenter extends Illuminate\\Pagination\\Presenter {

    /**
     * Get HTML wrapper for a page link.
     *
     * @param  string  $url
     * @param  int  $page
     * @param  string  $rel
     * @return string
     */
    public function getPageLinkWrapper($url, $page, $rel = null)
    {
        $rel = is_null($rel) ? '' : ' rel="'.$rel.'"';

        if (strpos($url,"http://") === 0) {
            $url ="https://" . ltrim($url,"http://");
        }

        return '
<li>
'.$page.'
</li>
';
    }

    /**
     * Get HTML wrapper for disabled text.
     *
     * @param  string  $text
     * @return string
     */
    public function getDisabledTextWrapper($text)
    {
        return '<li class="disabled"><span>'.$text.'</span>
</li>
';
    }

    /**
     * Get HTML wrapper for active text.
     *
     * @param  string  $text
     * @return string
     */
    public function getActivePageWrapper($text)
    {
        return '<li class="active"><span>'.$text.'</span>
</li>
';
    }

}

请注意,getPageLinkWrapper() 具有将 http 替换为 https 的逻辑。

创建一个视图文件以使用演示者。在 app/views 中创建一个文件 zurb_pagination.php ,其内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
    $presenter = new ZurbPresenter($paginator);

    $trans = $environment->getTranslator();
?>

<?php if ($paginator->getLastPage() > 1): ?>
    <ul class="pager">
        <?php
            echo $presenter->getPrevious($trans->trans('pagination.previous'));

            echo $presenter->getNext($trans->trans('pagination.next'));
        ?>
   
</ul>

<?php endif; ?>

最后更改您的应用配置以使用 app\\config/view.php 中的新演示者进行分页:

1
'pagination' => '_zurb_pagination_simple',

我对我的网站使用了类似的方法,您可以在此处验证它是否正常工作。