Laravel: установить актив без протокола

Использование asset вспомогательная функция, как показано ниже:

<script src="{{ asset('/assets/js/jquery-2.1.1.min.js') }}"></script>

получите

<script src="http://xxx.xxx.com/assets/js/jquery-2.1.1.min.js"></script>

Есть ли в Laravel встроенные решения, позволяющие

<script src="//xxx.xxx.com/assets/js/jquery-2.1.1.min.js"></script>

и правильно отображать с http а также https протоколы?

[РЕДАКТИРОВАТЬ]

Я знаю, что Laravel обычно определяет протокол правильно, но когда он находится за балансировщиком нагрузки, это не так. Так что я все еще ищу решение этой проблемы.

8 ответов

Laravel создает защищенную ссылку, только если запрос считается защищенным.

В Laravel уже есть способ рассматривать не httpS-трафик как "защищенный", если он поступает от "доверенных прокси".

Вы можете объявить такие доверенные прокси в вашем поставщике услуг приложений следующим образом:

 Request::setTrustedProxies(array( '199.27.128.0/21', 'some other range'));

Также убедитесь, что ваш loadbalancer правильно установил следующие заголовки:

Host, X-Forwarded-Host, X-Forwarded-Port, X-Real-IP, X-Forwarded-For and X-Forwarded-Proto

"Общественные" прокси, такие как cloudflare, уже делают это между прочим.

Суть в том, что клиентское соединение прерывается на одном из внешних серверов (выступающем в качестве прокси-сервера), поэтому мы должны объявить связь с этим сервером как доверенную, чтобы laravel использовал заголовки с прокси-сервера вместо значений, считанных локально.

Делая это, включите функции, такие как Request::isSecure() или Request::ip(), чтобы получить согласованный результат.

Laravel автоматически изменит URL-адрес ресурса на протокол, используемый для загрузки сайта.

Если ваш сайт загружен через безопасное соединение, ссылки на ресурсы будут автоматически использовать https.

Обновить:

Если вы хотите отобразить активы только //Вы можете написать свой собственный макрос HTML.

У меня была такая же проблема, затем я обнаружил, что метод asset() имеет необязательную вторую переменную, true или false для запросов SSL.

Решение, которое я использую, заключается в следующем:

<link rel="stylesheet" href="{{ asset('assets/bootstrap/3.3.7/css/bootstrap.min.css', !App::isLocal()) }}" />

<script type="text/javascript" src="{{ asset('assets/parsley/2.4.4/parsley.min.js', !App::isLocal()) }}"></script>

Обратите внимание:

!App::islocal()

Если моя прикладная среда является локальной, SSL не выбирается, однако в производственной среде ресурсы будут вызываться через SSL.

Я обычно пользуюсь

<script src="/assets/js/jquery-2.1.1.min.js"></script>

без вызова функции asset()

грязно я знаю, но на 90% сайтов, с которыми я работал, это идеальное решение

Это может кому-то помочь.

Хелперная функция:

function schemalessAsset($path)
{
    if (url()->isValidUrl($path)) {
        return str_replace(['http:','https:'], '', $path);
    }

    return url()->assetFrom(url()->formatRoot('//'), $path);
}

Macroable способ:

URL::macro('schemalessAsset', function ($path) {
    if (URL::isValidUrl($path)) {
        return str_replace(['http:','https:'], '', $path);
    }

    return URL::assetFrom(URL::formatRoot('//'), $path);
});

Проверено в Laravel 5.6. Это должно работать и в других версиях.

Код, который генерирует URL-адреса активов, находится в подсветке /Routing/UrlGenerator.php

Существует метод forceSchema(), который можно легко изменить, чтобы он выполнял то, что вам нужно, хотя, честно говоря, эта функциональность, вероятно, должна быть в Laravel, и, возможно, стоит подать запрос на извлечение на их github.

asset() генерирует URL для актива, используя текущую схему запроса (HTTP или HTTPS):

И если вы хотите предоставить внешний URL-адрес, для которого вы не знаете о http или https, например URL-адрес cdn, вы можете написать, как показано ниже

<script src="{!! asset('//code.jquery.com/jquery-2.1.1.min.js') !!}"></script>

Однако вы можете написать как

<script src="//{!! Request::server ('HTTP_HOST').'/assets/js/jquery-2.1.1.min.js' !!}"></script>

ИЛИ ЖЕ

<script src="{!! asset('//'.Request::server ('HTTP_HOST').'/assets/js/jquery-2.1.1.min.js') !!}"></script>

Вы должны проверить эту статью http://ankitpokhrel.com/explore/overriding-base-url-in-laravel-5/. в основном вы можете переопределить url() функция в вашем AppServiceProvider генерировать URL-адреса, как /assets/something.js вместо http://example.com/assets/something.js

Другие вопросы по тегам