我需要为应用程序@ work处理资产中的混合内容。
我发现很少的解决方案。 而且我想知道哪种方法更好实施(或者可能要更改一个Apache配置)
第一个是在AppServiceProvider文件的启动方法中编写此代码:
\URL::forceScheme('https');
另一种解决方案是创建一个新的提供程序并将其添加到引导方法中:
view()->composer(['app'], function($view) use($request) {
$secureProtocol = false;
if(config('app.env') === "production") {
// this is for avoiding problems in local
$secureProtocol = true;
}
$view->with([
'secureProtocol' => $secureProtocol
]);
});
然后在资产助手中使用它:
<link rel="stylesheet" href="{{ asset('css/style.css', $secureProtocol) }}" type="text/css">
问题出在反向代理上,当我通过https获取网站时,反向代理正在通过http发送资产。
反向代理通过HTTP与apache服务器“对话”,但没有“重写” URLS来匹配浏览器和反向代理之间的主要请求所使用的协议。
然后$_SERVER['REQUEST_SCHEME']
总是等于'http'
我对这些服务器绝对没有控制权(而且我根本不掌握apache的配置),但是如果有人可以告诉我什么地方出了问题,我可以要求更改配置。
最后我无法真正告诉您更多原因,因为我被困在保密条款的后面
答案 0 :(得分:0)
如果您的反向代理行为正确,那么只需通过受信任的代理配置告诉Laravel trust its X-Forwarded-For
and X-Forwarded-Proto
headers。市场上任何主要的代理解决方案都应该发送这些消息-如果这很奇怪而且是自酿的,则您可能需要问题中概述的更黑客的解决方法。
答案 1 :(得分:0)
jekinney在laracasts上发布的解决方案是我用于可移植性的解决方案,因为在laravel 5.5之前我也正在使用它。
但是官方解决方案(信任转发标头)必须考虑在内。
<?php
namespace App\Providers;
use Illuminate\Routing\UrlGenerator;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot(UrlGenerator $url)
{
if(env('APP_ENV') !== 'local')
{
$url->forceSchema('https');
}
}