использование 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 обычно определяет протокол правильно, но когда он находится за балансировщиком нагрузки, это не так. Так что я все еще ищу решение этой проблемы.
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-макрос.
Код, который генерирует URL-адреса активов, находится в освещении / Routing / UrlGenerator.php
Существует метод forceSchema (), который можно легко изменить, чтобы он выполнял то, что вам нужно, хотя, честно говоря, эта функциональность, вероятно, должна быть в Laravel, и, возможно, стоит подать запрос на извлечение на их github.
Вы должны проверить эту статью http://ankitpokhrel.com/explore/overriding-base-url-in-laravel-5/. в основном вы можете переопределить url()
функция в вашем AppServiceProvider
генерировать URL-адреса, как /assets/something.js
вместо http://example.com/assets/something.js
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>
У меня была такая же проблема, затем я обнаружил, что метод 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. Это должно работать и в других версиях.