PHP: создание ссылок Laravel Paginator Secure (HTTPS)

Я разрабатываю приложение с использованием Laravel 4.2 через HTTPS с безопасными маршрутами и перенаправлениями. Я использую Paginator для разбивки результатов на страницы, но ссылки, отображаемые в представлении, указывают на страницы http, как мы можем заставить Paginator генерировать ссылки https?


person Waleed Ahmad    schedule 01.03.2015    source источник


Ответы (3)


Сегодня у меня была эта проблема, и я нашел это глобальное решение.

В методе AppServiceProvider :: boot вы можете добавить следующее, чтобы принудительно использовать https для ссылок на страницы

$this->app['request']->server->set('HTTPS','on');
person RDelorier    schedule 20.11.2015
comment
Это также работает для любой другой ссылки, поэтому я смог обменять ее на \URL::forceScheme('https'), который, похоже, игнорирует разбиение на страницы. Спасибо. - person andi79h; 13.03.2018

Если ваша текущая страница обслуживается по протоколу HTTPS, то сгенерированные URL-адреса разбивки на страницы должны использовать эту схему.

Однако, если вы используете прокси-сервер, который не передает правильные заголовки, класс Request, отвечающий за определение того, является ли соединение безопасным, может не сообщать об этом как таковом. Чтобы определить, распознается ли запрос как безопасный, используйте Request::secure(). Если это вернет false, попробуйте использовать Laravel Trusted Proxies.

Если это не сработает, вы можете принудительно использовать URL-адреса для разбивки на страницы с помощью setBaseUrl следующим образом:

$results->paginate();
$results->setBaseUrl('https://' . Request::getHttpHost() . '/' . Request::path());
person Bogdan    schedule 01.03.2015
comment
Для Laravel 5.1 вместо setBaseUrl можно использовать setPath. - person OskarD90; 08.10.2015

Добавьте настраиваемого презентатора ZurbPresenter.php в app/helpers/ (вы можете поместить его в другой каталог, если его путь включен в ClassLoader::addDirectories()):

<?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><a href="'.$url.'"'.$rel.'>'.$page.'</a></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 со следующим содержимым:

<?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 для разбивки на страницы:

'pagination' => '_zurb_pagination_simple',

Я использую аналогичный подход для своего веб-сайта, и вы можете проверить его работу здесь.

person petwho    schedule 03.09.2018