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 (), чтобы получить согласованный результат.

5

Другие решения

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

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

Обновить:

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

1

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

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

0

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

0

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>
0

У меня была такая же проблема, затем я обнаружил, что метод 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.

0

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

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

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

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

0

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

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

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. Это должно работать и в других версиях.

0
По вопросам рекламы [email protected]